我只是想找到更好的方法来做到以下几点:
我有一个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
感谢帮助
干杯!
答案 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");
}