【问题标题】:Cascading DDL razor pass values级联 DDL 剃须刀传递值
【发布时间】:2014-05-23 13:10:20
【问题描述】:

我要做的是使用我的数据库进行简单的级联 DDL。 假设我有一个对象类:

public class ObjectModel
{
    public int id { get; set; }
    public string type { get; set; }
    public string name { get; set; }
}

类型是-'factories'、'samples'和'sampleresults'。 用户选择工厂的那一刻——例如——显示所有工厂的名称。 我的 Task 类有 ObjectID 成员和 ObjectType 成员。 所以我想将第二个选项传递给 ObjectType 成员,而 ObjectID 获得第一个选项。 这是我使用的脚本:

    <script type="text/javascript">
    $(function () {
        $.getJSON("/Home/Object/List", function (data) {
            var items = "<option>---------------------</option>";
            $.each(data, function (i, object) {
                items += "<option value='" + object.Value + "'>" + object.Text + "</option>";
            });
            $("#Objects").html(items);
        });

        $("#Objects").change(function () {
            $.getJSON("/Home/ObjectType/List/" + $("#Objects > option:selected").attr("value"), function (data) {
                var items = "<option>---------------------</option>";
                $.each(data, function (i, objectType) {
                    items += "<option value='" + objectType.Value + "'>" + objectType.Text + "</option>";
                });
                $("#ObjectType").html(items);
            });
        });
    });
</script>

我的看法是:

   @Html.LabelFor(model => model.ObjectID) 
   <select id="Objects" name="Objects"></select>
    <br />

    @Html.LabelFor(model => model.ObjectName) 
    <select id="ObjectType" name="ObjectType"></select>

我的控制器是:

public ActionResult Create() { return View(); } 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(Task task) { 
      if (ModelState.IsValid) { 
         db.Tasks.Add(task); 
         db.SaveChanges(); 
         return RedirectToAction("Index"); } 
      return View(task); 
} 

所以一切正常,每次我放下第一个列表时,我都会得到所有类型,然后第二个 DDL 会显示相关名称。 唯一的问题是我不知道如何将这些值传递给我的模型类(任务类)。 我习惯使用@Html.dropdownlist 但我猜这次它不会起作用,因为我正在使用脚本。

【问题讨论】:

  • 您可以发布您尝试发布到的控制器方法吗?这将有助于澄清您的预期结果。另外(与您的问题无关),请注意,如果您希望 LabelFor 正常工作以实现可访问性,输入元素的 ID 需要与属性名称匹配。如果您使用的是 MVC3+,则可以使用 @Html.IdFor(model => model.Property)。
  • public ActionResult Create() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create(Task task) { if (ModelState.IsValid) { db.Tasks.Add(task); db.SaveChanges(); return RedirectToAction("索引"); } 返回视图(任务); }
  • 谢谢,我已将您的代码添加到您的原始帖子中以提高知名度。

标签: c# javascript asp.net-mvc razor html.dropdownlistfor


【解决方案1】:

好的,让我们先获取这些下拉列表的值

var obj = $('#Objects').val();
var objType = $('#ObjectType').val();

假设您的控制器操作是 TaskAction,我们将这些值作为获取参数传递

$.get("/Home/Controller/TaskAction", { object : obj, ObjectType : objType}, function (data) {

    //Do something after
});

假设你的 Task 类是这样的

public class Task
{

    public string Object { get; set;}
    public string ObjectType { get; set;}


}

然后你可以像这样对它进行模型绑定

public ActionResult TaskAction(Task myTask)
{

}

或像这样显式传递它

public ActionResult TaskAction(string object, string objType)
{
    new Task{ Object = object, ObjectType = objType}
}

希望对你有帮助

【讨论】:

  • 感谢您的评论。我对javascript有点陌生。当您说-让我们获取这些值时,我实际上应该在哪里写这两行?我在哪里写下'$.get'?抱歉这些问题,在 javascript 上是全新的,这一切似乎都无法阅读
  • 对不起,我应该解释得更好 - 当从下拉列表中选择对象类型时,您是否想触发它?
  • 我在脚本底部写了所有 3 行,并检查了所有值的拼写是否正确,它们确实通过了。感谢您的帮助
【解决方案2】:

只要表单元素的 name 属性与模型上的 public 属性的名称匹配,ModelBinder 就会很高兴。请注意,大小写很重要,并且拼写必须完全相同。因此,如果您的属性是 color,那么 name="Colors" 将无法正确绑定,因为大写 C 和额外的 s。

因此,如果您想使用现有 HTML 直接绑定到 TaskTask 必须如下所示:

public class Task() {
   public Task() { }
   //need a default constructor with no parameters for model binding to work 

   public string Objects { get; set; }
   //property name "Objects" matches value of input/select/textarea's name attribute

   public string ObjectType { get; set; }

   //other methods / properties as needed...
}

【讨论】:

  • 感谢您的回答。检查所有名称拼写相同后,它确实正确传递了值,再次感谢
猜你喜欢
  • 2021-04-25
  • 1970-01-01
  • 2016-07-23
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多