读取控制器中下拉列表的选定值

时间:2012-01-04 18:03:23

标签: asp.net-mvc-3 model-view-controller jquery asp.net-4.0

要求:我的cshtml页面上有一个下拉列表和一个表格。下拉列表显示供应商列表,并在表格中显示与所选供应商对应的详细信息。当下拉列表的值发生变化时,我使用jquery提交表单。

问题:如何在控制器中选择下拉值?

代码:

@Html.DropDownList("VendorList", new SelectList(Model.vendorList, "vendorId", "vendorName"))

@using (Html.BeginForm("VendorDetails", "VendorLookUp", FormMethod.Post, new { id = "vendorDetailsForm" }))
{
    <div class="margin-10-top" >
      <table id= "VendorDetail" class="VendorDetail">

        ........ details of vendor.........

      </table>
   </div>
}

<script type="text/javascript" charset="utf-8">
$(document).ready(function () {
    $('#VendorList').change(function () {
        $('#vendorDetailsForm').submit();
    });
}); 
</script>

我控制器中的代码是:

    [AcceptVerbs("POST")]
    public ActionResult SearchResult(FormCollection collection)
    {
        try
        {
            string vendorName = collection["searchItem"].ToString();

            vendorName = vendorName.Trim();
            List<Vendor> vendorList = Queries.compiledVendorQuery(dbContext, vendorName).ToList<Vendor>();

            if(vendorList.Count() == 0)
                return View("EmptySearch");

            Vendor selectedVendor = vendorList[0];

            VendorDetails vendorDeatils = Queries.compiledVendorDetailsQuery(dbContext, selectedVendor.vendorId.ToString()).FirstOrDefault();

            VendorResult vendorResult = new VendorResult();
            vendorResult.vendorList = vendorList;
            vendorResult.vendorDetails = vendorDeatils;

            return View(vendorResult);
        }
        catch (Exception e)
        {
            return View("EmptySearch");
        }
    }

    [AcceptVerbs("POST")]
    public ActionResult VendorDetails(FormCollection collection)
    {
        **here comes the control after postback
        require value of the selected item** 

        Vendor selectedVendor = ?? 

        VendorDetails vendorDeatils = Queries.compiledVendorDetailsQuery(dbContext, selectedVendor.vendorId.ToString()).FirstOrDefault();

        VendorResult vendorResult = new VendorResult();
        vendorResult.vendorDetails = vendorDeatils;

        return View(vendorResult);
    }

1 个答案:

答案 0 :(得分:0)

由于您并未真正使用FormCollection,因此您可以在操作方法中使用int(或模型中ID的任何内容):

[HttpPost]
public ActionResult VendorDetails(int vendorId = 0)
{
    Vendor selectedVendor = // Load from your data source using vendorId
    ...  // Do the rest of your work
}

在HTML中,将@Html.DropDownListFor()移到表单中,将其重命名为参数名称,然后照常提交表单。由于显示似乎对发送到服务器的内容没有任何影响,我会将其拉出来并将@Html.DropDownListFor()保留在表单中:

@using (Html.BeginForm("VendorDetails", "VendorLookUp", FormMethod.Post, new { id = "vendorDetailsForm" }))     
{
    @Html.DropDownList("vendorId", new SelectList(Model.vendorList, "vendorId", "vendorName"))
}

<div class="margin-10-top" >
    <table id= "VendorDetail" class="VendorDetail">
        ........ details of vendor.........
    </table>
</div>

<script type='text/javascript'>
    $(document).ready(function () {        
        $('#vendorId').change(function () {
            $('#vendorDetailsForm').submit();
        });
    });
</script>

修改

查看有关MVC模型绑定的this article,了解如何从提交的表单中注入vendorId。基本上,绑定器将使用name属性(默认情况下)将属性名称与模型匹配。在这种情况下,我们的模型只是int