关于ASP.NET MVC和DropDown列表的问题

时间:2010-02-09 01:33:33

标签: .net asp.net-mvc drop-down-menu

我即将启动一个新的ASP.NET MVC应用程序。在其中我们有许多下拉列表/框。我把它们交给ui等没问题。

我的两个问题是: -

  1. 是否可以将下拉列表的选定值绑定到枚举?其他人是否真的这样做(如果可能的话)
  2. 如果用户尝试为下拉列表注入不同的值,是否有任何良好的代码实践可以防止代码抛出异常。例如。而不是张贴所选的值,这是一个数字/ int ..他们试图破解帖子数据并将其更改为一个非数字字符串。什么是这个安全黑客/漏洞,叫做?
  3. 欢呼:)

2 个答案:

答案 0 :(得分:3)

正如jfar发布的那样,请使用:

string selectedValue = "1";

SelectListItem[] selectListItems = Enum.GetNames(typeof(MyEnumeration)).Select(
        s => new SelectListItem { Text = s, Value = s, Selected = s == selectedValue}).ToArray();

来自MVCContrib,你不要包含DLL,这只是在MVCContrib中找到的代码。

要防止CSRF(跨站点请求伪造),您可以使用将发布的相应表单下的视图中的<%= Html.AntiForgeryToken() %>,并使用[ValidateAntiForgeryToken]修饰相应的操作。有关Html.AntiForgeryToken()的更多详细信息可以是found here

根据评论编辑

首先,您需要将SelectListItem[]放在ViewData中,以便在视图中访问它:

动作

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult MyView(string enumValue)
{
    string selectedValue = "1"; // fill this with the value you want to be selected

    SelectListItem[] selectListItems = Enum.GetNames(typeof(MyEnumeration)).Select(
            s => new SelectListItem { Text = s, Value = s, Selected = s == selectedValue}).ToArray();

    ViewData["enumValue"] = selectListItems;

    return View();    
}

并且在您的视图中,以下表单将起作用。

<form method="post">
    <%= Html.AntiForgeryToken() %>
    <%= Html.DropDownList("enumValue") %>
</form>

HTML帮助器将输出正确的select控件。

回到您的控制器中,这是接受表单帖子的操作

[ValidateAntiForgeryToken]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MyView(int enumValue)
{
    // enumValue will have the selected value
    ViewData["Message"] = "You selected the Enum name" + Enum.GetName(typeof(MyEnumeration), enumValue);

    return View();    
}

答案 1 :(得分:1)

来自MVCContrib:

SelectListItem[] selectListItems = Enum.GetNames(propertyInfo.PropertyType).Select(
            s => new SelectListItem {Text = s, Value = s, Selected = s == value.ToString()}).ToArray();

如果枚举值始终为已知,则可以在路径中使用参数约束: http://www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/mvc/tutorial-24-cs.aspx

这样一来,任何人都无法获得或发布给你的行动方法。