"System.Web.Mvc.HtmlHelper" не имеет применимого метода с именем "Partial"

Я получаю эту ошибку:

ошибка CS1973: 'System.Web.Mvc.HtmlHelper' не применимо метод с именем "Частичный", но, по-видимому, имеет метод расширения имя. Методы расширения не могут динамически отправляться. Рассматривать литье динамических аргументов или вызов метода расширения без синтаксис метода расширения. "}

Из того, что я читаю здесь Razor View Engine: дерево выражений не может содержать динамическую операцию, заключается в том, что это связано с использованием viewbag (?), который я действительно используя сеанс.

Это моя веб-форма:

@using SuburbanCustPortal.MiscClasses

@{
    ViewBag.Title = "Account Screen";
 }

<h2>AccountScreen</h2>

<div class="leftdiv">
  <fieldset>
    <legend>Customer Info</legend>
    @Html.Partial("CustomerInfo")
  </fieldset>

  <fieldset>
    <legend>Delivery Address</legend>
    @Html.Partial("DeliveryAddress")
  </fieldset>

  <fieldset>
    <legend>Delivery Info</legend>
    @Html.Partial("DeliveryInfo")
  </fieldset>
</div>

<div class="rightdiv">
  <fieldset> 
    <legend>Balance</legend>
      @Html.Partial("AccountBalance")
  </fieldset>

             @if (SessionHelper.ShowPaymentOptions || SessionHelper.ShowHistory)
             {
               <fieldset>
                 <legend>Account Options</legend>
                 <br/>

                 @using (Html.BeginForm("AccountScreenButton", "Customer", FormMethod.Post))
                 {
                   <div class="sidebysidebuttons">
                     <div class="box">
                       @if (SessionHelper.ShowHistory && SessionHelper.ShowAccountScreenPaymentButton)
                       {
                         <button class="sidebysidebutton1" name="options" value="payment">Make a Payment</button>
                         <button class="sidebysidebutton2" name="options" value="activity">Display Activity</button>
                       }
                       else
                       {
                         if (SessionHelper.ShowAccountScreenPaymentButton)
                         {
                           <button class="leftpaddedsinglebutton" name="options" value="payment">Make a Payment</button>
                         }

                         if (SessionHelper.ShowHistory)
                         {
                           <button class="leftpaddedsinglebutton" name="options" value="activity">Display Activity</button>
                         }
                       }
                     </div>
                   </div>
                 }    
               </fieldset>
             }

  <fieldset> 
      <legend>Billing Info</legend>
        @Html.Partial("BillingInfo", Model)
    </fieldset>
</div>

Это часть моего SessionHelper, чтобы дать вам представление:

public static CustomerData CustomerSessionData
{
  get
  {
    try
    {
      return (CustomerData) HttpContext.Current.Session["CustomerSessionData"];
    }
    catch (Exception)
    {
      return null;
    }
  }
  set { HttpContext.Current.Session["CustomerSessionData"] = value; }
}

    public static bool ShowPaymentTab
    {
      get { return HttpContext.Current.Session["ShowPaymentTab"].ToBool(); }
      set { HttpContext.Current.Session["ShowPaymentTab"] = value; }
    }

Я не уверен, что проблема была в форме с тех пор, как я поставил точку останова в форме, она не останавливается на ней.

У меня есть два вопроса:

  • Как отладить, где проблема находится в форме?
  • Могу ли я использовать класс в качестве сеанса и ссылаться на него в форме? Я предполагаю, что это проблема.

Ответ 1

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

Обычно это не проблема, но у вас есть это:

@Html.Partial("BillingInfo", Model)

Это, по сути, передача динамического типа в ваш Html.Partial(), что и вызывает ошибку.

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