2016-05-23 8 views
1

Dies ist mein erstes Mal in diesem sehr interessanten Forum. Ich arbeite an einem MVC-Projekt. Ich habe mein Modell und darin eine Dezimaleigenschaft für die Währung. Auch ich habe seine Bearbeitungsansicht, in der ich Html Helper TextEditorFor verwende. Dieser Html-Helper zeigt auf der Webseite einen Wert aus der Datenbank, aber er zeigt ihn als Dezimalzahl mit Komma an. Dann, wenn ich diese Editierung ohne edditing nichts mehr senden möchte, sendet es nichts an die Datenbank und zeigt die falsche TextEditBox, in der ich die Kommas für einen Punkt ändern muss, um diese Daten an die Datenbank senden zu können. Ich hoffe, dass ich es richtig erklärt habe: PDezimalzahl mit Kommas senden auf cis mvc arbeiten

Dies ist das Modell, das ich habe:

[Display(Name = "Hardware purchasing")] 
[DataType(DataType.Currency)] 
public decimal Hardware { get; set; } 

Und der Blick

<div class="form-group "> 
@Html.LabelFor(model => model.Hardware, htmlAttributes: new { @class = "control-label col-md-2 col-xs-6" }) 
<div class="col-md-1 col-xs-3 "> 
    @Html.EditorFor(model => model.Hardware, new { htmlAttributes = new { @class = "form-control text-center" } }) 
    @*@Html.ValidationMessageFor(model => model.Hardware, "", new { @class = "text-danger" })*@ 
</div> 

ich für einige Verfahren gesucht, die mich lassen konvertieren diese Zahl mit Kommas zu dezimieren, um an die Datenbank zu senden. Vielleicht bekomme ich den html-Wert in den Controller und konvertiere es, aber ich weiß nicht, wie das geht und ob das der richtige Weg ist. Ich hoffe du könntest mir helfen. Vielen Dank.

+0

Wenn Sie einen Dezimaldatentyp verwenden, müssen Sie das Komma vom Dezimalwert entfernen. –

+0

Zeigen Sie uns einige Demo-Daten, um zu verstehen, was los ist .... Was gibt es in DB und was bekommen Sie in HTML ... nur Beschreibung führt nirgendwo .. – SamGhatak

+0

Geben Sie Controller Action Method Code, verwenden Sie Standard-Modell-Binder oder mit Request Params? –

Antwort

0

Der MVC-Standardmodellbinder kann den für die Anzeige formatierten Wert nicht analysieren. Also, Wahrscheinlich werden Sie Ihre eigene Mappe für Ihre Modellklasse am Ende zu schreiben und registrieren, in Application_Start:

public class Test 
    { 
     [Display(Name = "Hardware purchasing")] 
     [DataType(DataType.Currency)] 
     public decimal Hardware { get; set; } 
    } 

ein benutzerdefiniertes Modell Bindemittel erzeugen, wie unten:

public class TestModelBinder : DefaultModelBinder 
    { 
     public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
      { 
       var result = bindingContext.ValueProvider.GetValue("Hardware"); 

       if (result != null) 
       { 
        decimal hardware; 
        if (Decimal.TryParse(result.AttemptedValue, NumberStyles.Currency, null, out hardware)) 
        return new Test { Hardware = hardware }; 

       bindingContext.ModelState.AddModelError("Hardware", "Wrong amount format"); 
      } 

      return base.BindModel(controllerContext, bindingContext); 
     } 
    } 

registrieren sie Application_Start() im Bereich Global .asax

ModelBinders.Binders.Add(typeof(Test), new TestModelBinder()); 

schreiben Sie einfach die Modelbinder wie oben erwähnt, und dann in Ihrer Controller-Aktion method.Let weiß das Framework, welche Bindemittel Modell, das heißt zu verwenden Nicht das def Ault aber Ihre benutzerdefinierten ein

public ActionResult Edit([ModelBinder(typeof(TestModelBinder))] TestModelBinder test) 
0

Wenn Sie diese in Textbox konfrontiert sind aus der Datenbank

enter image description here

Dann müssen wir Modell für benutzerdefinierte Modell Bindemittel erstellen

Modell

public class DecimalModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, 
     ModelBindingContext bindingContext) 
    { 
     ValueProviderResult valueResult = bindingContext.ValueProvider 
      .GetValue(bindingContext.ModelName); 
     ModelState modelState = new ModelState { Value = valueResult }; 
     object actualValue = null; 
     try 
     { 
      actualValue = Convert.ToDecimal(valueResult.AttemptedValue, 
       CultureInfo.CurrentCulture); 
     } 
     catch (FormatException e) 
     { 
      modelState.Errors.Add(e); 
     } 

     bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
     return actualValue; 
    } 
} 

Danach müssen Sie es registrieren w its globle.asax Datei beim Start der Anwendung.

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 

     ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 
    } 

Auf diese Weise werden Sie die Hardware Feld beide akzeptieren bekommen 2.200.800,50 und 2,200,800.50.

0

Dies ist keine Antwort. Ich möchte die Informationen vervollständigen ... Zunächst einmal, vielen Dank für Ihre Antworten. Der Name meines Controllers lautet ConsultasController. Er wird aus dem Standard-.NET-MVC-Code erstellt, nachdem er mit View und Entity Framework-Option erstellt wurde. Dies ist der Code, den ich mit Edit-Funktion verwenden möchte:

public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     Consulta consulta = db.Consultas.Find(id); 
     if (consulta == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(consulta); 
    } 


    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Edit([Bind(Include = "ConsultaID,Usuario,FechaEntrada,Hardware,HardwareY,Software,SoftwareY,MaterialConsultaAlta,MaterialConsultaAltaY,InstalTelefonoInternet,InstalTelefonoInternetY,AlquilerOficina,AlquilerOficinaY,MobiliarioOficina,MobiliarioOficinaY,ImagenProfesional,ImagenProfesionalY,GastosEstablVarios,GastosEstablVariosY,MaterialConsultaRenov,MaterialConsultaRenovY,HardwareRenov,HardwareRenovY,SoftwareRenov,SoftwareRenovY,Afiliaciones,AfiliacionesY,Proteccion,ProteccionY,DominioInternet,DominioInternetY,MaterialFungible,MaterialFungibleY,Formacion,FormacionY, Publicidad, PublicidadY,Imprevistos,ImprevistosY,PRL,PRLY,GastosAnualesVarios,GastosAnualesVariosY,AlquilerOficinaMensual,AlquilerOficinaMensualY,SeguridadSocial,SeguridadSocialY,SeguroMedico,SeguroMedicoY,LuzCalefaccion,LuzCalefaccionY,GestoriaLitigios,GestoriaLitigiosY,AsesoriaAveriasInf,AsesoriaAveriasInfY,AlojamientoWeb,AlojamientoWebY,TelefonoInternetMensual,TelefonoInternetMensualY,GastosMensualesVarios,GastosMensualesVariosY,DiasVacaciones,DiasFestivos,DiasImprevistos,DiasTrabajoSemana,DiasFormacion,DiasGestiones,HorasTraduccion,TrabajoProductivo,Rendimiento,PrecioPalabra,PagasAnual,IRPF,SueldoMensual,NumeroPagas,IRPFdc,SueldoMensualdt,NumeroPagasdt,TarifaCobro,RendimientoDT")] Consulta consulta) 

    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(consulta).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     return View(consulta); 
    } 

Ich habe nichts wichtiges daran ändern. Das Ergebnis in der Ansicht sollte 123,23 € erscheinen, mit Kommas, die Dezimalstellen trennen und ich brauche, dass es auf 133,23 € mit Punkt übersetzt wird, der sql BD akzeptiert. Ich habe deine Antwort beobachtet, beides, aber ich kann nicht verstehen, wo ich diese Codes ablegen muss. Muss ich ein neues Modell machen oder sie in den Controller einfügen? Vielen Dank!

+0

Nein, Sie müssen kein neues Modell schreiben Sie müssen nur eine ModelBInder Klasse schreiben, die von 'DefaultModelBInder' erbt und' BindModel() 'Methode überschreibt, ich habe die obige Antwort aktualisiert. –