简体   繁体   中英

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

the controller code looks like

public class EmployeeController : Controller
{
    public enum EmployeeType
    {
        RecruitmentOffice,
        ResearchInstitute
    }

    public ActionResult Details(int id, EmployeeType type)
    {            
        switch (type)
        {
            case EmployeeType.RecruitmentOffice:
                // load repository
                // load domain object
                // load view specific to recruitment office
                break;
            case EmployeeType.ResearchInstitute:
                // load repository
                // load domain object
                // load view specific to recruitment office
                break;
        }
    }
}

now i want that how to generate form action method which will point to Details action method and pass the enum value like EmployeeType.RecruitmentOffice or EmployeeType.ResearchInstitute

and again when i will call that action method by jquery then how could i pass parameter for id & EmployeeType .

please discuss with sample code. thanks

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

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] .

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, eg

$.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')
        }
    });

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM