[英]ASP.NET MVC3 - Dynamically adding an item to array on object
我正在一个用户应该能够填写动态扩展表单的网站上工作。
我将添加一行灰色字段,当用户将焦点放在其中一个字段上时,以下 javascript 将添加该行
<tr class="unSelected">
<input name="id[]">
<input name="blabla[]">
</tr>
$('.unSelected').focusin(function () {
if ($(this).hasClass('unSelected')) {
var row = $(this).clone(true);
$(this).after(row);
$(this).removeClass('unSelected');
}
});
但是如何使用 razor 和 asp.net 来做到这一点,因为对象不会自动生成呢?
在 ASP.NET MVC 中,如果您有 model class ,例如:
public class PageModel
{
public Collection<RowItem> RowItems { get; set; }
}
public class RowItem
{
public int Id {get;set;}
public string MoreFields { get; set; }
}
您的 javascript 添加如下行:
<script type="text/javascript">
var currentRowIndex = 0;
$(document).ready(function () {
SetFocusEventForInputs('unSelected0');
});
function SetFocusEventForInputs(className) {
var inputSelector = '.' + className;
$(inputSelector).focusin(function () {
AddNewRowTo(this);
$(inputSelector).unbind('focusin').removeClass(className);
});
}
function AddNewRowTo(sendingInputField) {
currentRowIndex++;
var className = 'unSelected' + currentRowIndex;
var collectionNamePrefix = 'RowItems[' + currentRowIndex + '].';
var idField = $('<input/>').attr('name', collectionNamePrefix + 'Id').attr('type', 'text').attr('class', className);
var moreFields = $('<input/>').attr('name', collectionNamePrefix + 'MoreFields').attr('type', 'text').attr('class', className);
var cell = $('<td></td>').append(idField).append(moreFields);
var row = $('<tr></tr>').append(cell);
$(sendingInputField).parents("tr").after(row);
SetFocusEventForInputs(className);
}
</script>
<table>
<tr>
<td>
<input name="RowItems[0].Id" type="text" class="unSelected0" />
<input name="RowItems[0].MoreFields" type="text" class="unSelected0" />
</td>
</tr>
</table>
MVC 中的默认 model 绑定程序在发布时应该可以很好地解决它
[HttpPost]
public ActionResult YourPostActionHere(PageModel model)
{
var count = model.RowItems.Count();
etc...
}
你也可以这样做,因为在上面的代码示例中,你使用的是 jQuery,ASP.NET MVC 也支持(当然)。
也许我不明白你,但在上面的代码示例中我没有看到任何 PHP 代码。
你想要做的是一个不依赖于 PHP 或 Asp.Net 的客户端脚本,所以不管你的代码是由什么编写的。 这也应该在 Asp.Net mvc 中工作。
如果您想收集新的控制数据以在服务器端使用它,您可以通过 JavaScript 收集它并将其分配到可以在服务器端访问的隐藏字段中。 您可以通过将值保存在一个字符串中并由任何分隔符分隔来使用一个隐藏字段。
您可能只是缺少脚本标签吗? 就像其他人所说,javascript 是平台无关的。
<tr class="unSelected">
<input name="id[]">
<input name="blabla[]">
</tr>
<script src="/Scripts/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$().ready(function () {
$('.unSelected').focusin(function () {
if ($(this).hasClass('unSelected')) {
var row = $(this).clone(true);
$(this).after(row);
$(this).removeClass('unSelected');
}
});
});
</script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.