1

这是我的强类型视图

@using ( Html.BeginForm("Index", "Home",null, FormMethod.Post, new { id="FormPost" }))
{ 
    @Html.TextBoxFor(x => x.Name)  @Html.ValidationMessageFor(x => x.Name) 
        <br />
    @Html.TextBoxFor(x => x.LastName) @Html.ValidationMessageFor(x => x.LastName) 
        <br />
    @Html.TextBoxFor(x => x.Age)  @Html.ValidationMessageFor(x => x.Age) 
        <br />

    <input type=submit   value="submit" />
    <br /><br />    
 }

这是视图模型类:

public class MyViewModel
{
    [Required(ErrorMessage="Please enter first name") ]
    public string Name { get; set; }
    [Required]
    public string LastName { get; set; }
    [Required]
    public int Age { get; set; }
}

我使用下面的脚本将表单发布回 Index 操作方法

ReusableJqueryPost.prototype.CommonPost = function (formId) {

        var fid = $("#" + formId);
        var validated = $(fid).valid();
        if (validated) {
            $.ajax({
                type: 'POST',
                url: $(fid).attr('action'),
                data: $(fid).serialize(),
                accept: 'application/json',
                error: function (xhr, status, error) {

                    alert('error: ' + xhr.responseText + '-' + error);
                },
                success: function (response) {
                    alert('DATA SAVED!');
                    var resp = response;    
                }
            });
        }
};

Index Action 方法现在可以作为ActionResult返回

return View(objMyViewModel);

或作为或JsonResult

return Json(objMyViewModel);

如果我没有使用 jquery 帖子并将数据作为ActionResult返回,那么我不需要在客户端做任何事情。Asp.net MVC 将负责将值绑定到适当的文本框,因为@Html.TextBoxFor(....)

由于我使用 jquery post 发布到 action 方法并将数据返回为JsonResult,因此我希望将 json 字符串中的每个元素自动绑定到相应的Html.TextBoxFor(...)文本框,而不必使用 jquery 来查找文本框或选择框。 (如果有的话),然后根据 json 字符串中接收到的值将数据绑定到它。

问题

  1. 在开箱即用的 asp.net mvc 的某些功能下这可能吗?
  2. 是唯一可用的选项,可以使用 jquery 按名称/id 查找文本框或下拉菜单或任何其他输入元素,然后从 json 字符串中分配值
  3. 有什么方法可以让我编写一次这个作业,这样我就可以重用相同的代码,而无需在整个项目中为每个视图重复它?就像我在这里有一个 jquery post 方法可以在整个项目中使用一样。

谢谢

4

2 回答 2

1

您可以按照以下步骤来实现您的期望

  1. 对您的操作进行 ajax 调用
  2. 然后从动作返回部分视图作为字符串
  3. 然后使用 jquery 将容器替换为结果

例如:

jQuery 发布:

$.ajax({
    type: "POST",
    url: "Controller/Action", // URL
    data: {}, // Your data
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (result) {
        $("#result").replaceWith(result); // "#result" is your container which you want to replace for eg: div
    },
    error: function () {
    }
});

行动:

    [HttpPost]
    public JsonResult Insert(TypeName model)
    {
        return Json((RenderRazorViewToString("PartialViewName", UpdatedModel)), JsonRequestBehavior.AllowGet);
    }

将视图渲染为字符串:

    [NonAction]
    public string RenderRazorViewToString(string viewName, object model)
    {
        ViewData.Model = model;
        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
            return sw.GetStringBuilder().ToString();
        }
    }
于 2013-09-11T06:04:00.610 回答
0

退房 @Ajax.BeginForm- 我认为它可以满足您的要求。

于 2013-09-11T04:50:16.627 回答