Как вызвать Action от помощника и избежать рендера?
Я работаю над ASP.NE MVC4 и использую библиотеку LungoJS для разработки.
Я разрабатываю помощник для рендеринга элементов управления LungoJS так, как мне нужно.
Для входов Select я хочу получить JSON, который содержит данные для каждой опции.
Я могу получить необходимый JSON из действия существующего контроллера.
Но когда я вызываю действие из помощника, представление отображает мой HTML внутри <pre>
тег:-(
Посмотреть
<div class="form" id="address-data">
@Html.LungoInputFor(m => m.CaseServiceCaseModel.CaseAddressModel.AddressDataModel.TerritoryId, "text", @Labels.Territory, @htmlAttributesRO, true)
@Html.LungoSelectFor(m => m.CaseServiceCaseModel.CaseAddressModel.AddressDataModel.TerritoryId, @Labels.Territory, null, true, "GetTerritoryKendo", "Address")
помощник
public static MvcHtmlString LungoSelectFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string label = "", object htmlAttributes = null, bool fieldset = false, string action = "", string controller = "")
{
TagBuilder tag = new TagBuilder("select");
JavaScriptSerializer js = new JavaScriptSerializer();
MvcHtmlString data = ChildActionExtensions.Action(html, action, controller);
object[] json = js.Deserialize<object[]>(data.ToString());
foreach (Dictionary<string,object> item in json)
{
foreach (var property in item)
{
TagBuilder option = new TagBuilder("option");
switch (property.Key)
{
case "Selected":
if ((bool)property.Value)
{
option.MergeAttribute("selected","selected");
}
break;
case "Text":
option.InnerHtml = property.Value.ToString();
break;
case "Value":
option.MergeAttribute("value", property.Value.ToString());
break;
default:
break;
}
tag.InnerHtml += option.ToString(TagRenderMode.Normal);
}
}
return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
}
Я не понимаю, почему, если я получаю htmlstring из Action в переменной, и после того, как я возвращаю только html Select input, влияет на всю страницу... Если я комментирую ChildActionExtensions.Action(html, action, controller)
представление хорошо (но без содержания, которое мне нужно...)
1 ответ
Вы не должны использовать дочерние действия здесь (ChildActionExtensions.Action
помощник) потому что пишут прямо в ответ. Вместо этого вы можете включить в модель представления свойство, которое будет содержать нужную вам коллекцию, и напрямую передать его в качестве аргумента вашему помощнику. В качестве альтернативы (но это не очень хорошее решение) будет вызвать ваш DAL в помощнике, чтобы получить список.