如何使用剃刀下拉列表将模型传递回控制器

时间:2015-04-27 18:15:19

标签: c# html asp.net-mvc asp.net-mvc-4 razor

我有一个DropDownListFor控件,我希望显示一个显示值,该值位于模型/类中的属性中(这是Rule类。)视图的模型实际上是一个集合这些模型/类。但是,当我从DropDownList中选择项目时,我想将整个模型作为参数发回。我使用以下代码完美地工作,但参数中的Name属性返回null。其他属性都有适当的值。

查看代码:

@model List<StockTrader.Web.Data.Rule>

@{
    ViewBag.Title = "Configure Rules";
}

<h2>@ViewBag.Title</h2>

<h4>Choose a rule to edit:</h4>
<form method="post" id="rulesform" action="SaveRules">

@Html.DropDownListFor(m => m.First().RuleID, new SelectList(Model.AsEnumerable(), "RuleID", "Name"))

<div style="margin-bottom: 15px;">
    <label>Value:</label><br />
    <input type="number" name="Value" style="margin-bottom: 15px;" /><br />
    <button>Save Value</button>
</div>

控制器代码:

public ActionResult SaveRules(Rule model)
{
    //do something
}

规则类:

public class Rule
{
    public int RuleID { get; set; }

    public string Name { get; set; }

    public int Value { get; set; }

    public bool IsDeleted { get; set; }
}

我们确实有Kendo控件,所以如果另一个控件更合适,那么这是一个选项。

我很乐意再提供您可能需要的代码或信息。

有什么想法或想法吗?

编辑:

事实证明这就是我需要做的事情,接受的答案让我达到了这一点,所以我要把它留下来检查。

查看代码(包含脚本):

@Html.DropDownListFor(m => m.First().RuleID, new SelectList(Model.AsEnumerable(), "RuleID", "Name"), new { id = "ruleid", @onchange = "CallChangefunc(this)" })
@Html.HiddenFor(m => m.First().Name, new { id = "rulename" })

function CallChangefunc(e) {
    var name = e.options[e.selectedIndex].text;
    $("#rulename").val(name);
}

2 个答案:

答案 0 :(得分:2)

您需要一个隐藏字段,并在客户端使用更改事件的下拉列表来更新隐藏字段:

@Html.DropDownListFor(m => m.First().RuleID, new SelectList(Model.AsEnumerable(), "RuleID", "Name"),new { id= "ruleid" })
@Html.HiddenFor(m=>m.First().Name,new { id="rulename" })

和jquery代码:

$("#ruleid").change(function(){

  $("#rulename").val($(this).text());

});

第二个选项isif Rule集合来自数据库,您可以通过使用id来获取RuleName,方法是查询db in action。

答案 1 :(得分:0)

可以使用UIHint

来实现

在模型类的RuleID属性上,为UIHint添加注释。它基本上允许您为属性渲染部分(cshtml)。因此,在partial上,您可以使用模板生成具有所需样式的dropdwon。生成页面时。现在,您可以对Html.DropDownListFor使用相同的RuleID,并为其生成下拉菜单。

这将避免使用额外的jQuery代码来获取下拉值,并且代码更简洁,更可测试。