发布html选择MVC控制器。寻找更好的方法

时间:2016-02-02 20:16:28

标签: html asp.net-mvc asp.net-core-mvc

我只是想找到更好的方法来做到以下几点:

我有一个html选择:

<form method="post" action="/Account/ChangeUserRole">
  <select name="Val" onchange="this.form.submit();" class="span2">
   @foreach (var r in ViewBag.UserRoles)
   {
    @if (u.UserRole.ID == r.ID)
   {
    <option selected="selected" value="@u.ID/@r.ID">@r.Name</option>
   }
   else
   {
    <option value="@u.ID/@r.ID">@r.Name</option> // <-- better way?
   }
  }
  </select>
  </form>

我将其发布为“userid / roleid”,并在控制器端执行string.Split on / to split u.ID和r.ID

我想知道是否可以发布它,以便我的控制器以这种方式得到它们

[HttpPost]
public IActionResult ChangeUserRole(int UserID, int RoleID)

而不是这个巫术

[HttpPost]
public IActionResult ChangeUserRole(string Val)
{
    char[] splitChar = new char[] { '/' };
    string[] s = Val.Split(splitChar);
    int UserID = Convert.ToInt32(s[0]);
    int RoleID = Convert.ToInt32(s[1]);
}

对不起,很长的帖子。希望我的问题有道理。 我不是html助手的忠实粉丝。

旁注: 我正在使用MVC 6,ASP 5 - RC1

感谢帮助

干杯!

1 个答案:

答案 0 :(得分:3)

最佳解决方案是使用TagHelpers构建下拉列表。让我们首先创建一个特定于此视图的视图模型。

public class UserRoleEditVm
{
    public List<SelectListItem> Roles { set; get; }
    public int RoleId { set; get; }
    public int UserId { set; get; }
}

在你的get动作中,创建一个对象,加载属性值并将其发送到视图。

public IActionResult Create()
{
   // User Id and Role list is hard coded for demo. You may replace it with real data.

    var v = new UserRoleEditVm {UserId = 45};
    v.Roles = new List<SelectListItem>
    {
        new SelectListItem {Value = "1", Text = "Admin"},
        new SelectListItem {Value = "2", Text = "Editor"},
        new SelectListItem {Value = "3", Text = "Reader"}
    };
    return View(v);
}

在您的视图中,我们的视图模型是强类型的,我们希望使用Tag帮助程序来创建HTML标记。

@model UserRoleEditVm    
<form asp-action="ChangeUserRole" asp-controller="Account">

    <select asp-for="RoleId" asp-items="@Model.Roles">
        <option>Please select one role</option>
    </select>
    <input  type="hidden"asp-for="UserId"/>
    <input type="submit"/>

</form>

在您的HttpPost操作方法中,您可以使用视图模型的对象作为参数,而模型绑定器会将发布的表单值映射到该对象的属性值。

[HttpPost]
public ActionResult ChangeUserRole(UserRoleEditVm model)
{
    var userId = model.UserId;
    var roleId = model.RoleId;
    // to do : Do something with the above 2 values
    // to do :Save and redirect (PRG pattern)
    // return RedirectToAction("Success");
}