2013-09-11 3 views
1

Вот моя сильно типизированныхотображение JSON вернулся из контроллера сильно типизированных

@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; } 
} 

я отправляю форму обратно в индексный метод действия, используя сценарий ниже

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 Действие теперь может вернуться в ActionResult

return View(objMyViewModel); 

или или JsonResult

return Json(objMyViewModel); 

Если бы я был не с помощью Jquery пост и возвращает данные в качестве ActionResult тогда я Wouldnt нужно сделать что-нибудь на клиентская сторона. Asp.net MVC будет заботиться о связывании значения в соответствующие текстовые поля на счет @Html.TextBoxFor(....)

Поскольку я использую JQuery пост, чтобы отправить к способу действия и возврата данных в JsonResult, я хочу это же гибкость автоматического привязки каждого элемента в json-строке к соответствующим текстовым полям Html.TextBoxFor(...) вместо того, чтобы использовать jquery для поиска текстовых или выборочных пакетов (если они есть), а затем привязки данных к ним на основе значений, полученных в строке json ,

Вопросы

  1. Возможно ли это под каким-нибудь особенность ASP.NET MVC из коробки?
  2. Доступен только для использования jquery для поиска текстовых или выпадающих меню или любого другого элемента ввода по имени/id, а затем присваивания значения из строки json
  3. Есть ли способ написать это задание один раз, так что что я могу повторно использовать один и тот же код, не повторяя его по всему проекту для каждого представления? так же, как у меня есть один метод почтовых сообщений, который будет использоваться в проекте.

Благодаря

ответ

0

Заканчивать @Ajax.BeginForm - Я думаю, что это то, что вы просите.

1

Вы можете выполнить следующие шаги, чтобы добиться того, что вы ожидаете

  1. сделать вызов AJAX для вашего действия
  2. Тогда от действия вернуть частичное представление в виде строки
  3. Затем с помощью JQuery замены контейнера в результате

Для например:

Jquery POST:

$.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); 
    } 

Rendering Просмотр в виде строки:

[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(); 
     } 
    } 
Смежные вопросы