gpt4 book ai didi

c# - MVC DropDownList OnChange 更新其他表单字段

转载 作者:可可西里 更新时间:2023-11-01 07:44:42 25 4
gpt4 key购买 nike

我是 MVC 的新手(我正在摆脱传统 ASP.Net 的阴暗面)并且我知道 SO 更像是一个“为什么这不起作用”但是,作为 MVC 的新手,我只是想询问某事是如何实现的 - 我真的没有任何代码或标记,因为我现在不知道如何实现。

是的,使用一个类似的例子......我有一个表单,其中有一个“小部件”列表的下拉列表(让它工作,感谢 SO)......然后还有其他字段(长度/高度/宽度)具有“默认”值。

当表单显示时,会显示下拉菜单,但 L/H/W 的表单字段为空/禁用,直到用户从 DDL 中选择一个。

现在,在经典的 ASP.Net 世界中,您将在“onselectedindexchange”上执行回发,这将查看所选项目,然后使用“master widget entry”版本中的值更新 L/H/W 字段.

由于 MVC 没有回发......这是如何实现的?

最佳答案

在 Asp.Net MVC 中,当控件值更改时,没有像在 Web 表单中那样的回发行为。您仍然可以发布表单,在操作方法中,您可以读取选定的值(发布的值)并加载文本框的值并再次呈现页面。这是完整的表单发布。但是有更好的方法可以使用 ajax 执行此操作,因此用户不会体验到整个页面重新加载。

您要做的是,当用户更改下拉列表时,获取所选项目的值并调用您的服务器以获取您想要在输入字段中显示的数据并进行设置。

为您的页面创建 View 模型。

public class CreateViewModel
{
public int Width { set; get; }
public int Height{ set; get; }

public List<SelectListItem> Widgets{ set; get; }

public int? SelectedWidget { set; get; }
}

现在在 GET 操作中,我们将创建一个对象,初始化 Widgets 属性并发送到 View

public ActionResult Create()
{
var vm=new CreateViewModel();
//Hard coded for demo. You may replace with data form db.
vm.Widgets = new List<SelectListItem>
{
new SelectListItem {Value = "1", Text = "Weather"},
new SelectListItem {Value = "2", Text = "Messages"}
};
return View(vm);
}

你创建的 View 是强类型的 CreateViewModel

@model ReplaceWithYourNamespaceHere.CreateViewModel
@using(Html.BeginForm())
{
@Html.DropDownListFor(s => s.SelectedWidget, Model.Widgets, "Select");

<div id = "editablePane" >
@Html.TextBoxFor(s =>s. Width,new { @class ="myEditable", disabled="disabled"})
@Html.TextBoxFor(s =>s. Height,new { @class ="myEditable", disabled="disabled"})
</div>
}

以上代码将为 SELECT 元素呈现 html 标记,并为宽度和高度呈现 2 个输入文本字段。 (在页面上做一个“查看源代码”看看)

现在我们将有一些 jQuery 代码监听 SELECT 元素的 change 事件并读取所选项目的值,对服务器进行 ajax 调用以获取所选小部件的高度和宽度.

<script type="text/javascript">
$(function(){

$("#SelectedWidget").change(function() {

var t = $(this).val();

if (t !== "") {
$.post("@Url.Action("GetDefault", "Home")?val=" + t, function(res) {
if (res.Success === "true") {

//enable the text boxes and set the value

$("#Width").prop('disabled', false).val(res.Data.Width);
$("#Height").prop('disabled', false).val(res.Data.Height);

} else {
alert("Error getting data!");
}
});
} else {
//Let's clear the values and disable :)
$("input.editableItems").val('').prop('disabled', true);
}

});
});

</script>

我们需要确保在 HomeController 中有一个名为 GetDetault 的操作方法来处理 ajax 调用。

[HttpPost]
public ActionResult GetDefault(int? val)
{
if (val != null)
{
//Values are hard coded for demo. you may replae with values
// coming from your db/service based on the passed in value ( val.Value)

return Json(new { Success="true",Data = new { Width = 234, Height = 345}});
}
return Json(new { Success = "false" });
}

关于c# - MVC DropDownList OnChange 更新其他表单字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34043287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com