2017-10-12 8 views
1

J'ai une page de soumission où l'un des champs du formulaire est des coordonnées lat/long. Je les stocker dans un System.Data.Entity.Spatial.DbGeography appelé « Lieu », et rendre les champs comme ceci:System.Data.Entity.Spatial.DbGeography - Constructeur sans paramètre

<div class="form-group"> 
      @Html.LabelFor(model => model.Location.Longitude, new { @class = "control-label col-md-2" }) 
      <div class="col-sm-3"> 
       @Html.TextBoxFor(model => model.Location.Longitude) 
       <img class="load-icon" src="~/Content/Loading.gif" /> 
       @Html.ValidationMessageFor(model => model.Location.Longitude) 
      </div> 

      @Html.LabelFor(model => model.Location.Latitude, new { @class = "control-label col-md-2" }) 
      <div class="col-sm-3"> 
       @Html.TextBoxFor(model => model.Location.Latitude) 
       <img class="load-icon" src="~/Content/Loading.gif" /> 
       @Html.ValidationMessageFor(model => model.Location.Latitude) 
      </div> 
     </div> 

Dans mon contrôleur, je reçois la forme de l'autre côté:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "...Location...")] Report report) 

Mais chaque fois que je POST avec les valeurs de la forme, il déclenche une exception, indiquant qu'un objet (il ne parvient pas à me dire lequel) n'a pas de paramètre constructeur moins. Lorsque je supprime 'Location' de la chaîne de liaison, mais conserve toutes les autres propriétés (omis dans mon exemple), cela fonctionne très bien. Cela semble indiquer que le problème est qu'il essaie de créer un DbGeography à mettre en 'rapport', mais échoue parce qu'il ne peut pas l'instancier. Est-ce correct? Si oui, comment puis-je éviter cette erreur? Je préfère ne pas utiliser une classe personnalisée dans ma base de données, mais je ne peux pas penser à d'autres options.

+0

a-DBGeography un constructeur par défaut? – Zinov

+0

ce n'est pas constructeur public sans arguments –

+0

donc, si ce n'est pas constructeur public, ce que votre attente - c'est votre réponse –

Répondre

0

la meilleure façon, il est d'utiliser un sqlQueryCommand ce code 100% travaillé:

var id = form["id"]; 
      var name = form["name"]; 
      var lat = form["Location.Latitude"]; 
      var lng = form["Location.Longitude"]; 
      db.Database.ExecuteSqlCommand("insert into [dbo].[schoolinfo] values ('" + id + "','" + name + "',geography::Point(" + lat + ", " + lng + ", 4326))"); 
+0

Non, ce n'est pas sûr du tout, ne faites pas cela. – JOSEFtw

+0

pourquoi pas? @JOSEFtw –

+0

J'ai un problème pour lier une dbGéographie alors je choisis formcollection et sqCommand –