我想将表格中的值发送到服务器。
表单由仅包含输入的部分视图组成。 这样做的目标是实现更多的代码可重用性。 目前,部分观点不是强类型的,但它们将是。
提交BeginFormSitefinity
我尝试提交beginFormSitefinity但是小部件从屏幕上消失并发生回发。但是,我只想保存更改并保持在同一页面中。因此,提交Html.BeginFormSitefinity不是一种选择。
使用JQuery序列化目标表单
然后我尝试使用Jquery发送表单值。 我按ID序列化了表单但是我总是得到一个空的结果。
var frm = $('#AccountForm');
var jsonFrm = JSON.stringify(frm.serializeArray()); // result = []
使用JQuery在页面中序列化表单元素
因此,我尝试在页面中查询“form”元素,因为Sitefinity会在DIV中转换您的beginformSitefinity,并将其快速添加到表单Read more...。
var frm = $('form');
var jsonFrm = JSON.stringify(frm.serializeArray());
对于我的惊喜,我能够获得我的形式的所有价值观。我也有了
换句话说,这是aspnetForm,页面中的唯一形式(Just Found out)。 这不是我想要的,因为它检索其他字段。如果我在屏幕上有更多表格,他们也会被检索。我宁愿只得到我的表单输入,因为它可以减轻我对aspnetForm的过滤。
问题
你们是否知道只发送我的表单值而不是将整个aspnetForm中的所有值发送到服务器?
将由partialviews组成的处方集的值发送到服务器的最佳方法是什么?
Jquery的
$('#btnsubmit').on('click', function () {
var url = '@Url.RouteUrl("ControllersRoute", new { controller = "Controller", action = "Action" })';
var frm = $("form").serializeArray();
alert(frm)
$.ajax({
url: url,
type: "Post",
data: { model: JSON.stringify(frm) },
dataType: "json",
success: function (response) {
alert('success');
},
error: function (response) {
alert('error');
}
})
});
查看
@using (Html.BeginFormSitefinity("Action", "AccountForm"))
{
Html.RenderPartial("_CustomerInfo");
Html.RenderPartial("_DeliveryDetail");
Html.RenderPartial("_OrderDetail");
<input id="btnsubmit" type="button" value="Save changes">
}
部分观点
_OrderDetail
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
</head>
<body>
<div>
<input id="OrderDetail" name="OrderDetail" type="text" value="Order" />
</div>
</body>
</html>
_DeliveryDetail
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
</head>
<body>
<div>
<input id="deliveryDetail" name="deliveryDetail" type="text" value="Delivery" />
</div>
</body>
</html>
_CustomerInfo
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
</head>
<body>
<div>
<input id="CustomerDetail" name="CustomerDetail" type="text" value="Customer" />
</div>
</body>
</html>
答案 0 :(得分:1)
你应该使用Html.BeginFormSitefinity()而不是默认的MVC
答案 1 :(得分:1)
我很确定你想要的是序列化表单并对服务器进行异步POST。
我不熟悉你如何序列化你的表单,但这是我在我的Sitefinity项目中使用jquery的方式:
var $form = $('#idOfMyDivContainingMyInputs');
var serializedData = $form.find('input, select, textarea').serialize();
然后我使用$ .post。
发送此数据请注意,您无法执行此操作:
$form.serialize()
因为jquery的序列化仅适用于表单元素,而“表单”是div。
答案 2 :(得分:0)
处理此问题的最佳方法(以及大多数MVC友好的)方法是使用模型。 (您也可以简单地添加一个隐藏字段,并在发布表单后访问它。)
这将允许您在模型中为模型的每个属性显示和存储项目,然后在将模型发布到服务器时(提交表单时)轻松检索它们。请查看以下示例,以获得简短的演练:
出于示例目的,我创建了一个包含两个属性的非常基本的模型。这些属性将出现在您的表单中,以便它们的值可以序列化并映射到您的模型,以便在Controller中进行访问。
public class ExampleModel
{
//Your Properties Here
public string PropertyOne { get; set; }
public string PropertyTwo { get; set; }
}
存在两个操作,第一个只是实例化一个新的ExampleModel来填充View。第二个(用[HttpPost]属性修饰)将处理访问POST事件返回的属性。
//This initially renders your View
public ActionResult CreateExample()
{
ExampleModel model = new ExampleModel();
return View(model);
}
[HttpPost]
//This is for your POST event to submit your Form data to the server
public ActionResult CreateExample(ExampleModel model)
{
//Access Properties Here using model.PropertyName
return View(model);
}
以下View是通过Visual Studio友好的脚手架自动创建的,因此这里有很多“绒毛”,你可能并不真正需要。但是这将为每个属性创建适当的字段,以便它们可以轻松映射到您的模型。
@model YourProject.Models.ExampleModel
<!-- This is going to POST the Model to your CreateExample Action (Default FormMethod is a POST) -->
@using (Html.BeginForm("CreateExample","Default")) {
@Html.ValidationSummary(true)
<fieldset>
<legend>ExampleModel</legend>
<div class="editor-label">
@Html.LabelFor(model => model.PropertyOne)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PropertyOne)
@Html.ValidationMessageFor(model => model.PropertyOne)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.PropertyTwo)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PropertyTwo)
@Html.ValidationMessageFor(model => model.PropertyTwo)
</div>
<p>
<input type="submit" value="Create" />
</p>
<!-- enter code here -->
</fieldset>
}