ASP MVC - 编辑器模板问题(始终仅从第一个模板发送数据)
ASP MVC - Editor Templates issue (Sends always data from only first template)
我有一个 form/view,它代表一个包含简单属性的强类型模型和一个 IEnumerable 属性。我为模型的 IEnumerable 属性 使用编辑器模板。
for (int i = 0; i < @Model.Items.Count(); i++)
{
@Html.EditorFor(model => @Model.Items[i])
}
现在,模板如下所示:
@using (Html.BeginCollectionItem("Items"))
{
<table style="width: 100%">
<tr>
<td>
@Html.TextBoxFor(model => @Model.ID, new {id = "ID" })
</td>
<td>
@Html.TextBoxFor(model => @Model.Description, readonly="readonly", new {id = "Description" })
</td>
<tr />
<a role="button" id=getDescBtn>
</a>
</table>
}
我的模板脚本:
<script type="text/javascript">
$(document).ready(function() {
$("#getDescBtn").on('click', function (event) {
$.ajax({
url: '@Url.Action("LoadDescription")',
async: false,
cache: false,
data: {id: $("#ID").val()}
}).success(function (partialView) {
});
});
});
现在,我的控制器操作如下所示:
public ActionResult LoadDescription(string id)
{}
现在,假设我有两个模板:
在第一个中,ID 文本框包含值“1”。
在第二个中,ID 文本框包含值“2”。
当我按下第一个模板中的按钮时,我两次进入控制器操作,两次的值都是“1”(来自第一个模板)。
当我按下第二个模板中的按钮时,我得到一次控制器操作,值为“1”(来自第一个模板,尽管我按下了第二个模板的按钮)。
现在,我要实现的目标在逻辑上非常简单:按下第一个模板中的按钮,使用值为“1”的控制器操作一次。
在第二个模板中按下按钮,使用值为“2”的控制器操作一次。
另外,控制器中的动作负责计算描述值,然后填写描述字段。操作方法 return 应该是什么(我不认为我应该对整个表单执行 post),以及如何在使用 Ajax 时在成功函数中接收它?
感谢您的帮助。
我认为您需要为按钮和编辑器使用 类 而不是 ID。在您的代码中,您有多个文本框都带有 Id=ID 和多个带有 id=getDescBtn 的按钮。所以 $("#ID").val() 只会给你第一个元素的值 id="ID" 这是你的第一个文本框。
至于更新描述,您可以让您的操作 return 描述值,然后在 ajax 调用成功时设置描述文本框。
@using (Html.BeginCollectionItem("Items"))
{
<table style="width: 100%">
<tr>
<td>
@Html.TextBoxFor(model => @Model.ID, new {@class = "ID" })
</td>
<td>
@Html.TextBoxFor(model => @Model.Description, readonly="readonly", new {@class = "Description" })
</td>
<tr />
<a role="button" class="getDescBtn">
</a>
</table>
}
<script type="text/javascript">
$(document).ready(function() {
$(".getDescBtn").on('click', function (event) {
$.ajax({
url: '@Url.Action("LoadDescription")',
async: false,
cache: false,
data: {id: $(this).parent().find(".ID").val()}
})
.success(function (data) {
$(this).parent().find(".Description").val(data.description )
});
});
});
public JsonResult LoadDescription(string id)
{
//your logic here
return Json(new {description )});
}
我有一个 form/view,它代表一个包含简单属性的强类型模型和一个 IEnumerable 属性。我为模型的 IEnumerable 属性 使用编辑器模板。
for (int i = 0; i < @Model.Items.Count(); i++)
{
@Html.EditorFor(model => @Model.Items[i])
}
现在,模板如下所示:
@using (Html.BeginCollectionItem("Items"))
{
<table style="width: 100%">
<tr>
<td>
@Html.TextBoxFor(model => @Model.ID, new {id = "ID" })
</td>
<td>
@Html.TextBoxFor(model => @Model.Description, readonly="readonly", new {id = "Description" })
</td>
<tr />
<a role="button" id=getDescBtn>
</a>
</table>
}
我的模板脚本:
<script type="text/javascript">
$(document).ready(function() {
$("#getDescBtn").on('click', function (event) {
$.ajax({
url: '@Url.Action("LoadDescription")',
async: false,
cache: false,
data: {id: $("#ID").val()}
}).success(function (partialView) {
});
});
});
现在,我的控制器操作如下所示:
public ActionResult LoadDescription(string id)
{}
现在,假设我有两个模板: 在第一个中,ID 文本框包含值“1”。 在第二个中,ID 文本框包含值“2”。
当我按下第一个模板中的按钮时,我两次进入控制器操作,两次的值都是“1”(来自第一个模板)。 当我按下第二个模板中的按钮时,我得到一次控制器操作,值为“1”(来自第一个模板,尽管我按下了第二个模板的按钮)。
现在,我要实现的目标在逻辑上非常简单:按下第一个模板中的按钮,使用值为“1”的控制器操作一次。
在第二个模板中按下按钮,使用值为“2”的控制器操作一次。
另外,控制器中的动作负责计算描述值,然后填写描述字段。操作方法 return 应该是什么(我不认为我应该对整个表单执行 post),以及如何在使用 Ajax 时在成功函数中接收它? 感谢您的帮助。
我认为您需要为按钮和编辑器使用 类 而不是 ID。在您的代码中,您有多个文本框都带有 Id=ID 和多个带有 id=getDescBtn 的按钮。所以 $("#ID").val() 只会给你第一个元素的值 id="ID" 这是你的第一个文本框。
至于更新描述,您可以让您的操作 return 描述值,然后在 ajax 调用成功时设置描述文本框。
@using (Html.BeginCollectionItem("Items"))
{
<table style="width: 100%">
<tr>
<td>
@Html.TextBoxFor(model => @Model.ID, new {@class = "ID" })
</td>
<td>
@Html.TextBoxFor(model => @Model.Description, readonly="readonly", new {@class = "Description" })
</td>
<tr />
<a role="button" class="getDescBtn">
</a>
</table>
}
<script type="text/javascript">
$(document).ready(function() {
$(".getDescBtn").on('click', function (event) {
$.ajax({
url: '@Url.Action("LoadDescription")',
async: false,
cache: false,
data: {id: $(this).parent().find(".ID").val()}
})
.success(function (data) {
$(this).parent().find(".Description").val(data.description )
});
});
});
public JsonResult LoadDescription(string id)
{
//your logic here
return Json(new {description )});
}