如何在动态构建表单时使用Ajax表单
本文关键字:表单 Ajax 构建 动态 | 更新日期: 2023-09-27 18:29:56
我的aspx标记中有一个表单。
我动态地添加了一些字段。
我把它们交给管理员处理。
我应该如何在服务器端读取它们?
更新
-
我的表单包含
n
文本框。 -
我曾考虑使用一个模型,该模型将包含
IEnumerable<FormItem>
在客户端,我将使用Ajax表单进行填充。
有道理吗?
我想使用一个模型,它将包含一个IEnumerable
是的,好主意。因此,一旦你定义了FormItem
类(取决于你的需求),你就可以开始了:
public class FormItem
{
public string Value { get; set; }
}
然后:
<form id="myform" action="/" method="post">
<!-- Those inputs could be added dynamically -->
<input type="text" name="[0].Value" />
<input type="text" name="[1].Value" />
<input type="text" name="[2].Value" />
<input type="text" name="[3].Value" />
<button type="submit">OK</button>
</form>
最后AJAX化形式:
$(function() {
$('#myform').submit(function() {
var form = $(this);
$.ajax({
url: form.attr('action'),
type: form.attr('method'),
data: form.serialize(),
success: function(result) {
}
});
});
});
确保您查看了Phil Haack关于绑定到列表的预期有线格式的博客文章。
史蒂夫·桑德森关于编辑可变长度列表的博客文章也是必读之作。
假设您的表单包含一个文本框,供用户输入电子邮件地址,并且表单的标记如下所示:
@using (Html.BeginForm("Index"))
{
<!-- pretend this field was dynamically created with javascript -->
<input id="email" type="email" name="email" />
<button type="submit">Submit</button>
}
可以使用Request
对象的Form
属性访问email
文本框内的值:
public class HomeController : Controller
{
[HttpPost]
public ActionResult Index()
{
// Get the value of the input named `email`
var email = Request.Form["email"];
/* Do cool stuff because you can */
}
}
或者,您可以修改您的操作方法,以接受与输入名称相同的字符串参数:
public class HomeController : Controller
{
[HttpPost]
public ActionResult Index(string email)
{
// The default model binder will set the value of the `email` parameter to the
// value of the matching input from your form
/* Do cool stuff because you can */
}
}
还有其他方法,比如接受FormCollection类型的参数(请参阅此示例),或者创建具有强类型的视图模型类
您可以使用jQuery,如果您的字段是动态创建的,那么我想您应该将这些字段作为数组传递。您应该向每个新字段添加一个类,以便可以获取它们。
<input class="dynamicInput" type="text"></input>
<input class="dynamicInput" type="text"></input>
<input class="dynamicInput" type="text"></input>
<button id="submit">submit</button>
<script type="text/javascript">
$(function(){
var myArray = [];
$('#submit').on('click', function(i,val){
//It will go through any input with a class "dynamicInput"
$.each($('.dynamicInput'), function(){
myArray.push($(this).val());
});
//We'll send our array to MyAction
$.post('/MyController/MyAction', myArray, function(data) {
//If your action returns a string you could handle it through "data"
console.log(data);
});
});
});
</script>
然后,您的操作将通过http post请求将此数组作为JavaScript对象,您需要将其反序列化为C#数组,以便在服务器端处理它:
[HttpPost]
public ActionResult MyAction(FormCollection values)
{
var jsonArray = values["myArray"];
var deserializer = new JavaScriptSerializer();
var cSharpArray = deserializer.Deserialize<List<string>>(jsonArray);
//Here you will handle your array as you wish
//Finally you could pass a string to send a message to your form
return Content("Message to user");
}