【问题标题】:How to pass a select option value from a view to a controller in MVC5如何将选择选项值从视图传递到 MVC5 中的控制器
【发布时间】:2018-02-05 07:02:55
【问题描述】:

查看:

@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 中获取值并使用它来触发我视图中的另一个下拉菜单。

【问题讨论】:

  • 你想使用级联HTMLselect吗?如果我的猜测是正确的,请考虑使用客户端 JS 来触发对控制器操作的 AJAX 调用并从那里返回响应数据(可能使用部分视图或 AJAX success 可以 append 选项元素用于第二个下拉菜单)。跨度>

标签: c# html asp.net-mvc asp.net-mvc-5


【解决方案1】:

查看代码

@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】:

    如果您查看&lt;select&gt; Tag 的语法,它是这样的

    <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" />
    }
    

    【讨论】:

      【解决方案3】:

      目前您有 2 个问题:

      1) select 元素中的 option 标记要求 value 属性与 FormCollection 实例一起发布。

      2) BeginForm 应使用正确的控制器名称,并在相应的控制器操作方法上标记HttpPost 属性(默认情况下控制器操作方法使用HttpGet)。

      正确的用法应该是这样的:

      查看

      @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)并使用@ 987654336@ 方法在success 响应之后添加option 元素。

      【讨论】:

        【解决方案4】:

        你必须改变:

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

        到:

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

        【讨论】:

        • 我的控制器的名字是 APIController
        • 在您的情况下,只需要 API。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多