Un arbore de expresii poate să nu conțină o operație dinamică, dar nu-mi spune unde (Programare, C#, Asp.Net Mvc 3, Razor)

ErocM a intrebat.

Am o problemă în care primesc mesajul:

OrderGas.cshtml(24): eroare CS1963: An expression tree may not contain a dynamic operation”}

Acesta este codul meu pentru formularul web:

@using SuburbanCustPortal.MiscClasses

@{
    ViewBag.Title = "Order Gas";
}

<h2>Order Gas</h2>

        @using (Html.BeginForm("OrderGasSuccess", "GasOrder", FormMethod.Post))
        {
          @Html.ValidationSummary(true, "Submit was unsuccessful. Please correct the errors and try again.")

          <div>
            <fieldset>
              <legend>Account Information - all fields required</legend>

              <div class="highlightedtext">
                @ViewBag.Account
              </div>

              @if (SessionHelper.ShowPaymentOptions)
              {
                <div class="editor-label">
                  @Html.LabelFor(m => m.PaymentMethod)
                </div>
                <div class="editor-field">
                  @Html.DropDownListFor(x => x.PaymentMethod, SessionHelper.PaymentMethods)
                </div>
              }

              <div class="editor-label">
                @Html.LabelFor(m => m.TankPercent)
              </div>
              <div class="editor-field">
                @Html.TextBoxFor(m => m.TankPercent, new { @class = "GenericSmallTextBox" })
                <label class="SmallBluelabel">Please enter the current percentage in your tank.</label>
                @Html.ValidationMessageFor(m => m.TankPercent)
              </div>             

              <br/>

              <div class="editor-field">
                @Html.CheckBoxFor(x => x.IsFill)
                @Html.LabelFor(m => m.IsFill)
                <label class="SmallBluelabel">Would you like us to fill your tank?</label>
                @Html.ValidationMessageFor(m => m.IsFill)
              </div>

              <div class="editor-label">
                <b> - OR - </b>
              </div>

              @if (!string.IsNullOrWhiteSpace(ViewBag.AlternateGasMessage))
              {
                <fieldset class="pleasenote">
                  <legend>@ViewBag.AlternateGasMessageHeader</legend>
                  <label class="warningLabel">@ViewBag.AlternateGasMessage</label>                  
                </fieldset>
              }

              <div class="editor-label">
                @Html.LabelFor(m => m.Amount)
              </div>

              <div class="editor-field">
                @Html.TextBoxFor(m => m.Amount, new { @class = "GenericSmallTextBox" })
                <label class="SmallBluelabel">Or request a specific amount in the tank?</label>


                @if (ViewBag.MinimumGasMessage != null)
                {
                  <div>
                    <label class="SmallBluelabel">@ViewBag.MinimumGasMessage</label>
                  </div>
                }

                @Html.ValidationMessageFor(m => m.Amount)
              </div>             

              <div class="editor-label">
                @Html.LabelFor(m => m.ContactNumber)
              </div>
              <div class="editor-field">
                @Html.TextBoxFor(m => m.ContactNumber, new { @class = "GenericTextBox" })
                @Html.ValidationMessageFor(m => m.ContactNumber)                   
              </div>

              <div class="editor-label">
                @Html.LabelFor(m => m.Message)
              </div>
              <div class="editor-field">
                @Html.EditorFor(x => x.Message)            
              </div>

              <div>
                <input type="submit" value="Submit" class="typicalbutton"/>
              </div>

            </fieldset>

          </div>
        }

Aici este clasa care apelează formularul web:

public ActionResult OrderGas()
{
  var control = Logging.StartLog();

  try
  {
    Logging.WriteLog("Starting OrderGas");

    var svc = new SubService();
    var orderGasModel = new OrderGasModel();

    orderGasModel.ContactNumber = svc.GetCustomerPhoneNumber(SessionHelper.TokenId, SessionHelper.CurrentAccountGuid);
    Logging.WriteLog(string.Format("orderGasModel.ContactNumber: {0}", orderGasModel.ContactNumber));

    if (SessionHelper.ShowPaymentOptions)
    {
      SessionHelper.PaymentMethods = GetPaymentMethods2();
    }
    if (SessionHelper.MinimumGasOrderAmount > 0)
    {
      var msg = string.Format("Minimum gas order is {0} gallons.", SessionHelper.MinimumGasOrderAmount);
      Logging.WriteLog(msg);
      ViewBag.MinimumGasMessage = msg;
    }

    var gasordermsg = svc.GetAlternateGasOrderMessage(SessionHelper.TokenId);
    ViewBag.AlternateGasMessageHeader = gasordermsg.Item1;
    ViewBag.AlternateGasMessage = gasordermsg.Item2;
    ViewBag.Account = string.Format("{0}-{1}", SessionHelper.CurrentBranchNumber.ToBranchString(),
      SessionHelper.CurrentAccountNumber.ToAccountString());

    return View(orderGasModel);
  }
  catch (Exception ex)
  {
    Logging.WriteException(ex);
    Logging.WriteLog(ex.Message);
    return View("Error");
  }
  finally
  {
    Logging.WriteLog(control, "End OrderGas");
  }
}

Am comparat acest lucru cu istoricul meu pentru a vedea ce am schimbat și nu văd de ce nu mai funcționează. Când pun un debug pe PaymentMethods, acesta dă o excepție înainte de a ajunge acolo.

Am încercat să comentez părți din cshmtl și nu pot obține un răspuns clar cu privire la ce parte a acestuia cauzează eroarea.

Sunt pierdut… vede cineva ce fac greșit?

Comentarii

  • Dacă am numărat corect, se plânge despre PaymentMethod membru al clasei model. Există ceva specific în legătură cu acesta? Nu văd că îl setezi în codul acțiunii. –  > Por Wiktor Zychla.
  • @WiktorZychla Poți să-mi spui cum ai ajuns la asta? Nu înțeleg ce vrei să spui prin numărătoare? –  > Por ErocM.
  • Am răspuns deja, dar ca să explic un pic mai mult despre comentariul lui @WiktorZychla, eroarea indică OrderGas.cshtml(24):, ceea ce corespunde celei de-a 24-a linii din partea de sus a fișierului respectiv. S-a întâmplat să fie un lambda cu aspect destul de normal, dar a făcut evident să se caute un motiv pentru care lambda nu ar fi fost procesat. –  > Por Claies.
  • @Claies ah nu știam că 24 înseamnă a 24-a linie! Asta e bine de știut!!! Asta mă va ajuta foarte mult în viitor să îmi găsesc problemele. Cred că are sens doar acum că știu asta… Tyvm! –  > Por ErocM.
  • Posibil duplicat al Razor View Engine : Un arbore de expresii nu poate conține o operație dinamică –  > Por LCJ.
2 răspunsuri
Claies

Îți lipsește @model referință în HTML-ul tău. La prima linie care întâlnește un lambda și nu poate găsi un model, va arunca această eroare.

În partea de sus a cshtml-ului tău, adaugă @model OrderGasModel

Comentarii

  • dangit… atât de ușor. Mi-am dat cu capul de asta și am trecut complet cu vederea. Tyvm –  > Por ErocM.
Brian

În cazul meu, @model exista în partea de sus a paginii mele cshtml, dar pentru că făceam referire la o listă de obiecte, declarația „@model” a fost considerată o operațiune dinamică de către compilator. Codul meu arăta astfel:

@model List<MyDataStructure>

Așadar, a trebuit să declar o clasă care să conțină lista în cauză, apoi a trebuit să modific codul pentru a încărca lista (deoarece declarația mea „.ToList()” nu ar mai funcționa). Am ajuns la următorul rezultat:

@model ListMyDataStructure

public class ListMyDataStructure
{
    public List<MyDataStructure> ListOfData { get; set; }
}