2012-05-24 2 views
3

В asp.net mvc3,Можно ли использовать AJAX для доступа к html-помощнику?

Я использую javascript API для динамического отображения пользовательского интерфейса. Часть раздела ввода будет зависеть от количества элементов, на которые пользователь хочет ввести данные. В результате чего-то вроде этого не будет работать

@(Html.EditorFor(m => m.P[5].C.Description)) 

потому что это невозможно сделать во время выполнения. Какой тип процесса я использовал бы для вызова этого помощника во время выполнения с AJAX? Будет ли у меня действие контроллера, которое возвращает только ту информацию, которая была вызвана с помощью $.ajax()? Будет ли это в другом месте, чем действие контроллера?

ответ

3

Во время выполнения вы можете выполнить ajax, чтобы получить действие контроллера, которое отобразит представление как строку, которая, в свою очередь, может быть вставлена ​​/ добавлена ​​в DOM.

Создать новый результат действия, который возвращает JSON согласно ниже:

return new JsonResult 
    { 
     JsonRequestBehavior = JsonRequestBehavior.AllowGet, 
     Data = new { html = this.RenderPartialViewToString("YourPartialView", model) } 
    }; 

Примечания, выше используют следующие расширения контроллера:

public static string RenderPartialViewToString(this Controller controller, string viewName = null, object model = null) 
    { 
     if (string.IsNullOrEmpty(viewName)) 
     { 
      viewName = controller.ControllerContext.RouteData.GetRequiredString("action"); 
     } 

     controller.ViewData.Model = model; 

     using (var sw = new StringWriter()) 
     { 
      ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName); 
      var viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 
      viewResult.View.Render(viewContext, sw); 
      return sw.GetStringBuilder().ToString(); 
     } 
    } 

Для дальнейшего чтения относительно этого метода расширения: http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/

Все, что осталось бы, - это выполнить передачу, передающую параметр, обозначающий количество элементов для рендеринга и добавления e возвратил содержимое в ваше представление. Возможно, что-то вроде:

$.getJSON('url', numberofitems, function (data) { 
     $('#somecontainer').html(data.html); 
    }); 
0

Если я правильно вас понимаю, вы хотите динамически вставлять поля на клиенте, чтобы пользователи могли добавлять N-число полей без наличия предварительно сформированных полей bazillion в форме, и вы пытаетесь использовать ajax для этого ?

Я уверен, что вы могли бы сделать это, отринув html на сервере и подталкивая его к клиенту ... вы считали динамическое добавление страницы на javascript? В отличие от Webforms, MVC не заботится о том, какие элементы были на странице, когда она была отображена, она заботится только о данных, которые она получает в HttpPost.

+0

Извините, если я не сделал достаточно объясните. Я использую javascript для динамического вставки полей (это API интерфейса). Однако для некоторых полей, особенно для выпадающих списков, я надеялся использовать там помощника. –

1

Если вы тянете HTML и вставить его в DOM, вы не должны идти через JSON. Просто верните свое действие PartialView. Это уже в виде Html, и готовы быть вставлены в DOM

JS

$.getJSON('/someurl/GetMyView',{count:10}, function (data) { 
     $('#target').html(data); 
    }); 

Контроллер:

[HttpGet] 
public ActionResult GetMyView(int count) 
{ 
    MyModel model = //Get the model from somewhere 
    return PartialView(model); 
} 

Вид:

@model MyModel 

<div> 
    @Model.SomeProperty 
<div> 
Смежные вопросы