如何在MVC5中从视图传递选择选项值到控制器

5

视图:

@using (Html.BeginForm("Index", "APIController",FormMethod.Post))
{
    <select id="Segmentation" name="Segmentation">
    @foreach (var item in Model.listofSegments)
    {
        <option>@item</option>
    }
    </select>
    <input type="submit" value="Send" />
}

型号:

public class SegmentRepository
{
    public List<String> GetSegmentation()
    {
        //I have the values in this
    }
}

控制器:


public class APIController : Controller
{
    public ActionResult Index(FormCollection formCollection)
    {
        dynamic mymodel = new ExpandoObject();
        SegmentRepository segment = new SegmentRepository();
        mymodel.listofSegments = segment.GetSegmentation();
        String roleValue1 = formCollection["Segmentation"];
        return View(mymodel);
    }
}

我无法获取roleValue1中选择选项的值。

我想从roleValue1中取出该值,并用它来触发视图中的另一个下拉菜单。


你是否想使用级联 HTML select?如果我猜得对的话,考虑使用客户端 JS 触发 AJAX 调用控制器操作并从那里返回响应数据(可能使用部分视图或 AJAX success,可以为第二个下拉列表添加选项元素)。 - Tetsuya Yamamoto
4个回答

4

查看代码

@model dynamic
@{
    ViewBag.Title = "ddl";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>ddl</h2>

<div>
    @using (Html.BeginForm("ActionPostData", "Demo", FormMethod.Post))
{
    <select name="Segmentation">
        <option selected value="0">---Select---</option>
        @foreach (var item in Model)
        {
            <option value="@item.Value">@item.Text</option>
        }
    </select>
            <input type="submit" value="Send" />
}
</div>

控制器代码

public ActionResult Ddl()
{
    var segmentList = new List<listofSegments>();
    listofSegments segmentItem;
    var strArr = new string[] { "Jaipur", "Kota", "Bhilwara", "Udaipur", "Chitorgar", "Ajmer", "Jodhpur" };
    for (int index = 0; index < strArr.Length; index++)
    {
        segmentItem = new listofSegments();
        segmentItem.Text = strArr[index];
        segmentItem.Value = (index + 1).ToString();
        segmentList.Add(segmentItem);
    }
    return View(segmentList);
}

[HttpPost]
public ActionResult ActionPostData(string Segmentation)
{
    return RedirectToAction("Ddl");
}

public class listofSegments
{
    public string Text { get; set; }
    public string Value { get; set; }
}

2

如果您查看 <select> 标签的语法,它是这样的

<select>
  <option value="volvo">Volvo</option>
</select>

您需要设置每个选项的值,但在您的情况下,您只提供了文本而不是值。因此应该这样

@using (Html.BeginForm("Index", "APIController",FormMethod.Post))
{
    <select id="Segmentation" name="Segmentation">
    @foreach (var item in Model.listofSegments)
    {
        <option value="@item">@item</option> //if the value is same as text
    }
    </select>
    <input type="submit" value="Send" />
}

2

目前您面临两个问题:

1)您在select元素中的option标签需要使用value属性来与FormCollection实例一起进行POST提交。

2)BeginForm应该使用带有HttpPost属性的相应控制器操作方法的正确控制器名称(默认情况下,控制器操作方法使用HttpGet)。

正确的用法应该像这样:

View

@using (Html.BeginForm("Index", "API", FormMethod.Post))
{
    <select id="Segmentation" name="Segmentation">
    @foreach (var item in Model.listofSegments)
    {
        <option value="@item">@item</option>
    }
    </select>
    <input type="submit" value="Send" />
}

控制器

public class APIController : Controller
{
    [HttpPost]
    public ActionResult Index(FormCollection formCollection)
    {
        dynamic mymodel = new ExpandoObject();
        SegmentRepository segment = new SegmentRepository();
        mymodel.listofSegments = segment.GetSegmentation();
        String roleValue1 = formCollection["Segmentation"];

        return View(mymodel);
    }
}

如果你想将FormCollection传递给动态的ExpandoObject,需要考虑这个问题:FormCollection to expandoObject
此外,如果您想将select选项值传递到同一视图页面上的其他select元素中插入选项值,您需要在客户端使用jQuery AJAX回调($.ajax)传递数据并在success响应后使用append方法添加option元素。请注意保留HTML标签。

0

您必须更改:

@using (Html.BeginForm("Index", "APIController", FormMethod.Post))

至:

@using (Html.BeginForm("Index", "API", FormMethod.Post))

我的控制器的名称是APIController。 - Sid
在你的情况下,只需要API。 - Masoud Sadeghi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接