2015-07-07 1 views
1

Я пытаюсь создать расширение HTML, которое объединяет три помощника HiddenFor. мне удалось получить, насколько ниже, что делает, по крайней мере компиляции:Использование htmlextensions (html.HiddenFor) в собственном расширении

public static class BatchHelper { 
    public static MvcHtmlString DisplayHiddenSummary<TModel, TValue>(this HtmlHelper<TModel> helper, BatchSummary batchSummary) where TModel : BatchSummary{ 

     var batchId = helper.HiddenFor(model => model.BatchId); 
     var batchTotal = helper.HiddenFor(model => model.BatchTotal); 
     var totalExpected = helper.HiddenFor(model => model.TotalExpected); 

     var result = MvcHtmlString.Create(batchId.ToString() + batchTotal.ToString() + totalExpected.ToString()); 
     return result; 
    } 
} 

У меня возникают проблемы, используя это, хотя, я получаю предупреждения о том, чтобы параметры необходимы, что имеет смысл, хотя все примеры, на которые я смотрел, похоже, распознают его как метод расширения и не требуют параметра HtmlHelper.

Спасибо!

EDIT Код вид выглядит следующим образом:

@using GridMvc.Html 
@using GridMvc.Sorting 
@using MyProj.Web.ViewModels.Receipt 
@model MyProj.Web.ViewModels.Grids.DonorSummaryGrid 

@Html.AntiForgeryToken() 

@if (Model.BatchSummary != null) { 
    // These Work fine, and are what I'm trying to put in the extension. 
    @Html.HiddenFor(model => model.BatchSummary.BatchId) 
    @Html.HiddenFor(model => model.BatchSummary.BatchTotal) 
    @Html.HiddenFor(model => model.BatchSummary.TotalExpected) 

    // this is where I want to use the extension 
    @(Html.DisplayHiddenSummary(Model.BatchSummary)) 
} 

ответ

1

Ваша функция должна выглядеть следующим образом. Параметр TValue не нужен. Кроме того, ваши лямбды были неправильными.

public static class BatchHelper { 
     public static MvcHtmlString DisplayHiddenSummary<TModel,TProperty>(this HtmlHelper<TModel> helper, TProperty batchSummary) 
where TModel : MyViewModel 
where TProperty: BatchSummary 

{ 

      var batchId = helper.HiddenFor(a => batchSummary.BatchId); 
      var batchTotal = helper.HiddenFor(a => batchSummary.BatchTotal); 
      var totalExpected = helper.HiddenFor(a => batchSummary.TotalExpected); 

      var result = MvcHtmlString.Create(batchId.ToString() + batchTotal.ToString() + totalExpected.ToString()); 
      return result; 
     } } 

Ваша Бритва должна быть следующей, при условии строго типизированного типа MyViewModel и свойства с именем BatchSummary:

@(Html.DisplayHiddenSummary<MyViewModel, BatchSummary>(Model.BatchSummary)) 
+0

Спасибо, но я все еще получаю ошибку «Неверное число параметров типа для метода ...». –

+0

Это интересно, поскольку я опубликовал это на основе чистой реализации против ViewModel, который у меня есть в текущем запущенном проекте, который компилируется и запускается без проблем. Было бы интересно увидеть мнение, из которого оно вызвано. - EDIT: Какую версию ASP.Net MVC имеет в виду? –

+0

Я только что добавил код просмотра и понял, что я вошел в систему под другим именем пользователя, ожидая экспертного обзора или чего-то еще. Во всяком случае, версия MVC - 5.2.3.0. –

1

Вы, наверное, не называя его правильно. Вы делаете это родовым, но у вас BatchSummary жестко закодирован. Итак ... общая часть не нужна (хотя вы можете использовать ее или передать в выражении, подобном другим помощникам). Для этого, вы можете упростить его до:

public static MvcHtmlString DisplayHiddenSummary(this HtmlHelper helper, BatchSummary batchSummary) 
{ 
    var batchId = helper.HiddenFor(model => model.BatchId); 
    var batchTotal = helper.HiddenFor(model => model.BatchTotal); 
    var totalExpected = helper.HiddenFor(model => model.TotalExpected); 

    var result = MvcHtmlString.Create(batchId.ToString() + batchTotal.ToString() + totalExpected.ToString()); 
    return result; 
} 

Тогда в представлении:

@Html.DisplayHiddenSummary(Model.BatchSummary) 

Вы, возможно, придется добавить пространство имен этого помощника, используя директиву @using, добавив его в Интернете .config или просто выбросив его в System.Web.Mvc.Html.

Вы также можете рассмотреть шаблоны дисплея и редактора вместо этого настраиваемого помощника.

+0

Не работает, я получаю System.Web.Mvc.HtmlHelper 'не содержит определения для' HiddenFor 'и не использует метод расширения' HiddenFor ', принимающий первый аргумент типа «System.Web.Mvc.HtmlHelper» можно найти (вам не хватает директивы using или ссылки на сборку?). –

+0

Вы должны добавить правильные пространства имен. Попробуйте добавить '@using System.Web.Mvc.Html'. См. Мое второе к последнему предложению в моем ответе. – br4d

+0

Поместите пространства имен как в представление, так и в класс, но не пойдите. –

0

В конце концов что-то получилось. Если бы rumage в исходном коде MVC и нашел фрагмент кода, который помог мне придумать следующее:

using System.Linq.Expressions; 
using System.Text; 
using StJudes_Donor.Web.ViewModels.Receipt; 

namespace System.Web.Mvc.Html { 
public static class BatchHelper { 

    public static MvcHtmlString DisplayHiddenSummary(this HtmlHelper helper, BatchSummary batchSummary) { 
     StringBuilder batchId = HiddenBuilder(batchSummary.BatchId.ToString(), "BatchId"); 
     StringBuilder batchTotal = HiddenBuilder(batchSummary.BatchTotal.ToString(), "BatchTotal"); 
     StringBuilder batchExpected = HiddenBuilder(batchSummary.TotalExpected.ToString(), "BatchExpected"); 

     return MvcHtmlString.Create(batchId.ToString() + batchTotal.ToString() + batchExpected.ToString()); 
    } 

    private static StringBuilder HiddenBuilder(String value, String id) { 
     StringBuilder inputItemBuilder = new StringBuilder(); 

     TagBuilder hiddenInput = new TagBuilder("input"); 
     hiddenInput.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden)); 
     hiddenInput.MergeAttribute("id", id); 
     hiddenInput.MergeAttribute("name", id); 
     hiddenInput.MergeAttribute("value", value); 
     inputItemBuilder.Append(hiddenInput.ToString(TagRenderMode.SelfClosing)); 

     return inputItemBuilder; 
    } 
} 
} 

Это называется в представлении с

@Html.DisplayHiddenSummary(Model.BatchSummary) 

это дало следующий HTML

<input id="BatchId" name="BatchId" type="hidden" value="1"> 
<input id="BatchTotal" name="BatchTotal" type="hidden" value="21.31"> 
<input id="BatchExpected" name="BatchExpected" type="hidden" value="12.31">