如何将值从表单发送到服务器(Sitefinity MVC Widgets)

时间:2015-10-13 13:35:46

标签: jquery asp.net-mvc forms sitefinity

我想将表格中的值发送到服务器。

表单由仅包含输入的部分视图组成。 这样做的目标是实现更多的代码可重用性。 目前,部分观点不是强类型的,但它们将是。

提交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());

对于我的惊喜,我能够获得我的形式的所有价值观。我也有了

  • “ScriptManager1_TSM”
  • “ctl11_TSSM”
  • “__ EVENTTARGET”
  • “__ EVENTARGUMENT”
  • “__ VIEWSTATE”
  • “__ VIEWSTATEGENERATOR”
  • “ctl00 $ ScriptManager1”

换句话说,这是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>

3 个答案:

答案 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>

}