2016-04-30 3 views
0

ich mit einem seltsamen Verhalten bin stecken .. Ich habe eine Aktion, die Excel-Datei zurückgibt:Wieder .. Die Parameter Wörterbuch einen Null-Eintrag für den Parameter enthält

public ActionResult AgentPortfolioReport(DateTime fromDate, DateTime toDate) 
    { 
     ... 

     return File(ms.ToArray(), "application/vnd.ms-excel", "SomeReport.xlsx"); 
    } 

Dann habe ich in meiner Ansicht nach setzen:

@Html.ActionLink("Get Report", "AgentPortfolioReport", new { fromDate = DateTime.Today.AddDays(-15), toDate = DateTime.Today }, new { @class = "iin-submit", id = "loadPortfolio" }) 

Alles funktioniert gut, Datei wird heruntergeladen. Dann kommen variable Daten ins Spiel. Ich versuche, mit einem sauberen Javascript mit einer Funktion zu machen:

Und Boom! Ich erhalte eine Ausnahme:

The parameters dictionary contains a null entry for parameter 'toDate' of non-nullable type 'System.DateTime' for method 'System.Web.Mvc.ActionResult AgentPortfolioReport(System.DateTime, System.DateTime)' in 'AgentsNetwork.Controllers.ReportsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. 
Parameter name: parameters 

Ich habe auch versucht, es so mit einem Formular zu arbeiten:

@using (Html.BeginForm("AgentPortfolioReport", "Reports", FormMethod.Get)) 
{ 
    <div> 
    Укажите период:<br/> 
    <label for="fromDate">C </label> 
    <input id="fromDate" name="fromDate" type="text" /> 
    <label for="toDate"> по </label> 
    <input id="toDate" name="toDate" type="text" /> 
    </div> 
    <p> 
    <input type="submit" value="Get report" /> 
    </p> 
} 

Aber das Ergebnis ist das gleiche. Das Hinzufügen eines NULL-ID-Parameters hat nicht geholfen. Bitte geben Sie mir einen Hinweis, was falsch ist.

+0

Wann wird die Ausnahme auftreten? Wann wird das Formular gepostet? Verwenden Sie auch benutzerdefinierte Ordner? – newmanth

+0

@newmanth Anfrage selbst trifft keine Aktion. Wenn ich also auf einen Knopf klicke, bekomme ich diesen Fehler. Keine benutzerdefinierten Modellbinder ist Benutzer. Das Seltsame ist, dass mit Acitonlink alles gut funktioniert. – IDeveloper

+0

Also, ich denke, Ihr Problem könnte in den Globalisierungseinstellungen liegen. In welchem ​​Format sind deine Datumseinträge? Verwenden Sie beispielsweise "30.4.2016" oder "30/4/2016" oder etwas anderes? – newmanth

Antwort

0

Standardmäßig verwendet MVC eine invariante Kultur in seinem Modellbinder. Dies führt leider dazu, dass der DateTime-Parser bricht, wenn Sie dem Binder ein nicht übereinstimmendes Datum/Uhrzeit-Format bereitstellen. Um dies zu überwinden, können Sie ein eigenes Modell Bindemittel wie so erstellen, die culture code ändern, je nach Fall:

using System; 
using System.Globalization; 
using System.Web.Mvc; 

public class DateTimeBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     return value.ConvertTo(typeof(DateTime), new CultureInfo("ru-RU")); 
     } 
    } 
} 

Fügen Sie die folgenden zwei Zeilen in Application_Start() Methode in Global.asax.cs:

ModelBinders.Binders.Add(typeof(DateTime), new DateTimeBinder()); 
ModelBinders.Binders.Add(typeof(DateTime?), new DateTimeBinder()); 
+0

Dies betrifft nicht das Problem von OP, weshalb der Wert if 'null' ist - wenn ein Datum in einem anderen Format vom Server gesendet wurde Kultur und Bindung fehlgeschlagen, der Wert der Eigenschaften wäre "1/1/0001" (nicht "null", und es gäbe keine Ausnahme) –

+0

Das ist nicht wahr, ich habe es selbst verifiziert. Wenn das Datum in einem anderen Format als der Anwendungskultur eingegeben wird, wird eine Laufzeitausnahme ausgelöst. Wenn Sie beispielsweise 30.4.2016 eingeben (gilt nicht für invariante Kultur, aber für ein gültiges russisches Datumsformat), schlägt der Standardordner fehl, und es wird eine Ausnahme ausgelöst. Wenn Sie jedoch den oben angegebenen benutzerdefinierten Binder hinzufügen, wird der Wert korrekt übergeben. – newmanth

+0

OP hat behauptet, dass das Erzwingen des Parameters nullable weiterhin den Fehler verursacht, so dass das Format/die Kultur keinen Unterschied macht. Dies ist kein OP-Problem. –

Verwandte Themen