【问题标题】:How to pass data from Razor View Kendo UI DropDownList to Controller Variable?如何将数据从 Razor View Kendo UI DropDownList 传递到控制器变量?
【发布时间】:2013-08-23 19:58:30
【问题描述】:

vs'12、KendoUI、asp.net C# MVC4 Internet Application EF Code First

想看看如何将 KendoUI DropDownList 中的值从 Razor 视图传递到 MVC 控制器

控制器

  [HttpPost]
  //[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(ViewModelCCTRST model) //, FormCollection  values)
    {

        if (ModelState.IsValid)
        {

            string clt = model.Clients;
            string cnt = model.Countys;
            string twn = model.TownShips;
            ...
             ...
            //string xx = values["Clients"];
            //       xx = values["Countys"];
            //       xx = values["TownShips"];
                     ...
                      ...

*clt,cnt,twn 和其他变量始终为空......我的问题是为什么这些始终为空**


剃刀视图:

                @ @(Html.Kendo().DropDownListFor(m=>m.Ranges)
                      //.Name("ranges")
                      .HtmlAttributes(new { style = "width:300px"}) //, id = "ranges"})
                      .OptionLabel("Select Range...")
                      .DataTextField("RangeName")
                      .DataValueField("RangeID")
                      .DataSource(source => {
                          source.Read(read =>
                          {
                              read.Action("GetCascadeRanges", "AddCCCTRST")
                                  .Data("filterRanges");
                          })
                          .ServerFiltering(true);
                      })
                      .Enable(false)
                      .AutoBind(false)
                      .CascadeFrom("TownShips")
                )
                <script>
                    function filterRanges() {
                        return {
                            townShips: $("#TownShips").val()
                        };
                    }

我尝试过的事情

  • 设置 var text = dropdownlist.text();
  • 设置 var DDLtracts = $("#tracts").data("kendoDropDownList");

无论我尝试 id 明智还是控制器明智,我都无法在 Controller 中将值“读取”,也无法在操作链接中抓取并传递这些值。

请帮忙!!


更新的代码mmillican 帮助下方的每条评论

                string sct = model.Sections;
                string trt = model.Tracts;

视图模型

public class ViewModelCCTRST
{
    public string Clients { get; set; }
    public IEnumerable<dbClient> AvailableClients { get; set; }
    public string Countys { get; set; }
    public IEnumerable<dbCounty> AvailableCounties { get; set; }
    public string TownShips { get; set; }
    public IEnumerable<dbTownShip> AvailableTownShip { get; set; }
    public string Ranges { get; set; }
    public IEnumerable<dbRange> AvailableRanges { get; set; }
    public string Sections { get; set; }
    public IEnumerable<dbSection> AvailableSection { get; set; }
    public string Tracts { get; set; }
    public IEnumerable<dbTract> AvailableTracts { get; set; }
}

到目前为止,我们所做的是:

  • 从控制器中删除了 [AcceptVerbs(HttpVerbs.Post)]FormCollection values
  • 从每个 DropDownList 中删除了 //.Name("Tracts") 和可选的 .HtmlAttributes(new { id = "tracts"})
  • 为每个 DDL 添加了 DropDownListFor(m=&gt;m.Tracts) 并导入了 @model OG.ModelView.ViewModelCCTRST CustomViewModel 可以在下面阅读
  • 将所有小写.CascadeFrom("clients")(不仅仅是客户端)重命名为大写.CascadeFrom("Clients")

下面的标签显示 alert("Select Tract to Upload:\n....); 在这些更改期间确实发出了 1 次警报,但是尝试使用 Actionlink 从 Razor 视图发送的模型和变量是仍然为空,并且警报停止弹出。

    $(document).ready(function () {
        $("#get").click(function () {
            var clients = $("#Clients").data("kendoDropDownList"),
            countys = $("#Countys").data("kendoDropDownList"),
            TownShip = $("#TownShip").data("kendoDropDownList"),
            ranges = $("#Ranges").data("kendoDropDownList"),
            sections = $("#Sections").data("kendoDropDownList"),
            tracts = $("#Tracts").data("kendoDropDownList");

      var clientsInfo = "\nclients: { id: " + clients.value() + ", name: " + clients.text() + " }",
      countysInfo = "\ncountys: { id: " + countys.value() + ", name: " + countys.text() + " }",
       ....
        ....

      alert("Select Tract To Upload:\n" + clientsInfo + countysInfo + townShipsInfo + rangesInfo + sectionsInfo + tractsInfo);
           });
    });

更新

修复了语法问题,修复了 scipt 错误。现在正在填充clientsInfo + countysInfo + townShipsInfo + rangesInfo + sectionsInfo + tractsInfo - 这是否有助于任何人帮助我将其发送到我的控制器?

【问题讨论】:

  • 请注意逗号,不要使用分号。您正在创建一个名为“alert”的变量 - 混淆编译器。这会导致各种错误。
  • @Brett 感谢您的关注!
  • 顶,还有什么想法吗?
  • 要将数据发送到控制器,一种简单的方法是将其字符串化并通过 ajax POST 发送。你没有粘贴你的 HTML 标记,所以我不知道你现在是怎么做的——无论是通过表单提交还是通过 ajax。 $.ajax({ url: 'http://localhost/&lt;controller&gt;/&lt;action&gt;', data: JSON.stringify({ clients: {...}, countys: {...}, etc. }), type: 'POST', contentType: 'application/json' });

标签: asp.net-mvc-4 razor kendo-ui kendo-asp.net-mvc model-view


【解决方案1】:

您应该使用包含您的属性的ViewModel,例如:

更新

public class MyViewModel
{
    public string Clients { get; set; }
    public IEnumerable<Client> AvailableClients { get; set; }
    public string Countys { get; set; }
    public IEnumerable<Client> AvailableCounties { get; set; }
    public string TownShips { get; set; }
    public IEnumerable<Client> AvailableTownShips { get; set; }
    public string Sections { get; set; }
    public IEnumerable<Client> AvailableSection { get; set; }
    public string Tracts { get; set; }
    public IEnumerable<Tract> AvailableTracts { get; set; }
}

然后您的 Kendo DropDownList 将变为 DropDownListFor&lt;&gt;,如下所示:

@(Html.Kendo().DropDownListFor(m => m.Clients)
                  .HtmlAttributes(new { style = "width:300px"}) //, id = "clients"})
                  .OptionLabel("Select Client...")
                  .DataTextField("ClientName")
                  .DataValueField("ClientID")
                  .DataSource(source => {
                       source.Read(read => {
                           read.Action("GetCascadeClients", "ImageUpload");
                       });
                  })
                 ***1***
            )

然后您可以通过以下方式发布到您的控制器:

[HttpPost]
    public ActionResult Index(MyViewModel model)
    {

        if (ModelState.IsValid)
        {

            var newVar = model.Clients;

当您将 ViewModel 返回到 View(从控制器)并且 MyViewModel.Clients 的值为“Client1”时,DropDownList 将选取该值并将其设为选定值。

希望这是您正在寻找的/有意义的。

【讨论】:

  • 有意义,很快就会在这里试用,客户、县、乡镇是完整的模型,但是,我不需要我的 ViewModel 中的客户集合 - 我对离题的问题表示歉意这将是我创建的第一个 ViewModel。
  • 在这种情况下,是的。我会用一些对你有帮助的东西来更新我的答案。如果您需要更多帮助,请告诉我。
  • 我向 ViewModel 添加了一些属性,我认为这些属性正是您所要求的。但是,现在我考虑一下,您正在使用 AJAX 绑定,因此您可能不需要这些。如果您不想使用 AJAX 绑定,可以在 DropDownListFor&lt;&gt; 中添加 .BindTo(Model.AvailableClients),但这不适用于级联下拉菜单。
  • 尝试去掉 DropDownLists 上的 .Name("sections")
  • 奇怪。尝试从 POST ActionMethod 中删除 FormCollection values 参数。此外,[AcceptVerbs(HttpVerbs.Post)] 是多余的,可以删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多