'System.Web.Mvc.HtmlHelper' 没有名为 'Partial' 的适用方法

'System.Web.Mvc.HtmlHelper' has no applicable method named 'Partial'

我收到这个错误:

error CS1973: 'System.Web.Mvc.HtmlHelper' has no applicable method named 'Partial' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax."}

从我在这里读到的Razor View Engine : An expression tree may not contain a dynamic operation是由于使用了我真正使用的 Session 的 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. 如何调试表单上的问题所在?
  2. 我可以不使用 class 作为会话并在表单中引用它吗?我假设这就是问题所在。

您的问题是您没有在视图顶部定义模型。因此,默认类型是 dynamic.

类型

通常情况下,这不是问题,但您遇到了这个问题:

@Html.Partial("BillingInfo", Model)

这实际上是将动态类型传递给您的 Html.Partial(),这就是引发错误的原因。

无论如何,这是一个毫无意义的调用,只需删除它的模型部分,它应该可以工作。无论如何,传递模型是默认操作,因此您不会尝试做任何不是默认操作的事情。

在以下情况下也会出现此错误:

  • 假设您有两个分部视图名称 A 和 B
  • 如果您在 index.html 中调用局部视图 A 并将模型作为 @Html.RenderPartialAsync("A",Model) 传递给它,那么局部视图 A 将捕获模型
  • 现在,如果您尝试调用 Partialview B 并再次传递模型,则会产生错误,因为这次模型是作为动态对象传递的。
  • 您需要将局部视图B调用为@Html.RenderPartialAsync("B"),模型将在第二个局部视图中自动继承。