Прочитать выбранное значение выпадающего в контроллере - PullRequest
0 голосов
/ 04 января 2012

Требование: у меня есть выпадающий список и таблица на моей странице 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 голосов
/ 04 января 2012

Поскольку вы на самом деле не используете 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, чтобы понять, как vendorId вводится из отправленной формы. По сути, связыватель будет сопоставлять имена свойств с атрибутом name (по умолчанию) для вашей модели. В данном случае наша модель просто int.

...