How to pass Enum from view to model ASP.Net MVC

后端 未结 4 1111
广开言路
广开言路 2020-12-15 13:01

the controller code looks like

public class EmployeeController : Controller
{
    public enum EmployeeType
    {
        RecruitmentOffice,
        ResearchI         


        
相关标签:
4条回答
  • 2020-12-15 13:45

    This is also pretty cool:

    [Flags]
    public enum PersonRole { User, Student, Instructor };
    

    then from your razor view:

    <button onclick="onclickDeleteRole('@(PersonRoleEnum.User|PersonRoleEnum.Student)')">
    

    and in your javascript:

    function onclickDeleteRole(role) {
        var personId = $('#SelectedPersonId').val();
    
        $.ajax({
            url: window.getUrl('Person/DeletePersonRole'),
            type: 'POST',
            dataType: 'json',
            data: {
                personId: personId,
                roles: role
            },
            success: function (json) {
                alert('success!')
            },
            error: function (jqXHR, status, error) {
                alert('error')
            }
        });
    }
    

    and your controller action:

    public JsonResult DeletePersonRole(int personId, PersonRoleEnum roles)
    {
        // do business logic here...
        // roles will now have value PersonRoleEnum.User|PersonRoleEnum.Student
        // and you can use roles.HasFlag(PersonRoleEnum.User) to check if that flag is set
    
        return Json(new {Result = "OK"});
    }
    

    EDIT: for readability, you can always use strings in javascript, and MVC will parse those for you, e.g.

    $.ajax({
            url: window.getUrl('Person/DeletePersonRole'),
            type: 'POST',
            dataType: 'json',
            data: {
                personId: 1,
                roles: 'Student'
            },
            success: function (json) {
                alert('success!')
            },
            error: function (jqXHR, status, error) {
                alert('error')
            }
        });
    
    0 讨论(0)
  • 2020-12-15 13:47

    If you pass an enum value in your form, it will show up as an int in you controller. I think you have 2 ways to handle this :

    • make the type parameter an int, then cast it to your enum in your action
    • make a specific model binder that looks for an input called type and tries to cast it before getting into your action.

    Some links, with sample code, may help you : http://www.codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder http://www.codeproject.com/Articles/551576/ASP-NET-MVC-Model-Binding-and-Data-Annotation

    0 讨论(0)
  • 2020-12-15 13:51

    What about sending as string and convert to enum

    public ActionResult Details(int id, string type)
    { 
    EmployeeType empType= (EmployeeType) Enum.Parse(
                                              typeof(EmployeeType), type, true );
    }
    

    or do write the custom model binder.

    Note: Request params are string

    0 讨论(0)
  • 2020-12-15 13:53

    If your enum is defined like this:

    public enum EmployeeType {
        RecruitmentOffice, //value = 0
        ResearchInstitute //value = 1
    }
    

    In your View (*.cshtml) you can pass enum value like this:

    var enumVal = 0; @* RecruitmentOffice *@
    $.ajax({
        url: '@(Url.Action("Details", "Employee"))',
        type: 'POST',
        dataType: 'json',
        data: {
            id: employeeId ,
            type: enumVal
        }
        success: function (result) {
           @* Handle success *@
        }
    }
    

    Where the enumVal is the Enum Value you need. And don't forget to decorate your Details action method with [HttPost].

    0 讨论(0)
提交回复
热议问题