字典包含参数' domainType'的空条目。非可空类型

时间:2014-07-31 10:18:15

标签: c# asp.net-mvc dictionary html.dropdownlistfor

我想知道是否有人可以帮助我理解为什么下面的POST操作(SelectDomain)总是传递一个空值。应该使用下拉菜单将Post方法传递给枚举类型(演示,客户端,开发),但目前情况并非如此。

在我的控制器中,我有以下几行:

public enum DomainCategories { Demo, Client, Dev };

public ActionResult SelectDomain()
{
    SetViewBagDomainType(DomainCategories.Client);
    return View();
}

private void SetViewBagDomainType(DomainCategories domainCategories)
{
    IEnumerable<DomainCategories> values = Enum.GetValues(typeof(DomainCategories)).Cast<DomainCategories>();

    IEnumerable<SelectListItem> items =
        from value in values
        select new SelectListItem
        {
            Text = value.ToString(),
            Value = value.ToString(),
            Selected = value == domainCategories,
        };

    ViewBag.WebsiteType = items;
}

[HttpPost]
public ActionResult SelectDomain(DomainCategories domainType)
{
    ViewBag.messageString = domainType.ToString() +
                            " val = " + (int)domainType;
    myWebsite.subdomain = domainType.ToString();
    createWebsite();
    return View(myWebsite);
}

在视图中我有以下内容:

@model Installer.Models.Website
@{
    ViewBag.Title = "SelectCategory";
}

<h2>Select Category</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    <fieldset>
        Subdomain: 
        @Html.DropDownList("WebsiteType")
        <p>
            <input type="submit" value="Submit" />
        </p>
    </fieldset>
}

完整的例外是: [ArgumentException:参数字典包含非可空类型'Installer.Controllers.WebsitesController + DomainCategories'的参数'domainType'的空条目,用于'Installer.Controllers中的方法'System.Web.Mvc.ActionResult SelectDomain(DomainCategories)'。 WebsitesController”。可选参数必须是引用类型,可空类型,或者声明为可选参数。

任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

@Html.DropDownList("WebsiteType")呈现以下html

<select id="WebsiteType" name="WebsiteType">
  <option value="Demo">Demo</option>
  <option selected="selected" value="Client">Client</option>
  <option value="Dev">Dev</option>
</select>

public ActionResult SelectDomain(DomainCategories domainType)

期待一个名为domainType的参数,但浏览器正在发送WebsiteType

您可以通过更改参数名称

来解决此问题

public ActionResult Index(DomainCategories websiteType)

或更新您的控制器以将ViewBag名称设置为domainType,并更新视图以匹配此。