2015-06-20 2 views
-1

Работая над моим проектом, я столкнулся с проблемой: EF не загружал данные из подключенного стола, но в другом практически равном фрагменте кода все идеально. Может кто-нибудь объяснить это?Два одинаковых фрагмента кода работают по-разному

Вот ситуация:

Все хорошо, type.name загружен:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult pacientEdit([Bind(Include = "ID,comments")] Anamnesis anamnesis) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(anamnesis).State = EntityState.Modified; 
     db.SaveChanges(); 
     return pacientDetails(anamnesis.ID); 
    } 
    return PartialView(anamnesis); 
} 

public ActionResult pacientDetails(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    Anamnesis anamnesis = db.anamneses.Include(p => p.type).Where(p => p.ID == id).First(); 
    if (anamnesis == null) 
    { 
     return HttpNotFound(); 
    } 
    return PartialView("~/views/Anamnesis/pacientDetails.cshtml", anamnesis); 
} 

Здесь я бегу PacientEdit, то он поступает в PacientDetails и дает мне полное anamnesis, включая полный тип с его именем.

Все это плохо, type.name равно нулю:

Во втором случае имя типа является нулевой несмотря на все мои попытки загрузки его из БД.

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult pacientEdit(Assigment assigment) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(assigment).State = EntityState.Modified; 

     db.SaveChanges(); 
     return pacientDetails(assigment.ID); 
     //dirty fix, but works: return (new AssigmentsController()).pacientDetails(assigment.ID); 
    } 
    return PartialView(assigment); 
} 
public ActionResult pacientDetails(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    Assigment assigment = db.assigments.Include(p => p.type).Where(p => p.ID == id).First(); 
    if (assigment == null) 
    { 
     return HttpNotFound(); 
    } 
    return PartialView("~/views/Assigments/pacientDetails.cshtml", assigment); 
} 

В этом случае все данные в pacientDetails, в том числе TYPE_ID загружающего, но type.name является нулевым

Может кто-нибудь объяснить такое поведение?

Используемые модели:

public class Anamnesis 
{ 
    public int ID { get; set; } 
    public AnamnesisEventType type { get; set; } 
    public String comments { get; set; } 
} 

public class Assigment 
{ 
    public int ID { get; set; }  
    public AssigmentType type { get; set; }  
    public decimal? weight { get; set; } 
    public decimal? dose { get; set; } 
    public decimal? inADay { get; set; } 
    [DataType(DataType.MultilineText)] 
    public String comments { get; set; } 
    public String medicine { get; set; } 
    [DefaultValue(1)] 
    public int actual { get; set; } 
    public DateTime cancelDate { get; set; } 



} 
public class AnamnesisEventType 
{ 
    public int ID { get; set; } 
    public String name { get; set; } 
} 
public class AssigmentType 
{ 
    public int ID { get; set; } 
    public String name { get; set; } 
    public String description { get; set; } 
} 

Вот вид на pacientEdit для AssigmentsController:

@model WebApplication2.Models.Assigment 

<form id="@String.Format("AssigmentsEdit{0}", Model.ID)"> 

    @Html.AntiForgeryToken() 
    @Html.HiddenFor(model => model.ID) 
    @Html.HiddenFor(model => model.type.ID) 
    @Html.HiddenFor(model => model.cancelDate) 
    @Html.HiddenFor(model => model.actual) 
    <div class="row"> 
     <div class="col-md-4"> 
      <strong> 
       @Html.DisplayFor(model => model.type.name) 
      </strong> 
     </div> 
     <div class="col-md-6"> 
      <p> 
       @Html.EditorFor(model => model.medicine, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.medicine) } }) 
      </p> 
     </div> 
     <div class="col-md-2"> 
      <a onclick="CancelEdit('Assigments', @Model.ID);" class="btn btn-warning btn-sm"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></a> 
      <a class="btn btn-sm btn-primary" onclick="PostEditForm('Assigments', @Model.ID);"> 
       <span class="glyphicon glyphicon-save" aria-hidden="true"></span> 
      </a> 
     </div> 
    </div> 
    <div class="row alert alert-info" style="margin-top:10px"> 
     <div class="col-md-4"> 
      <h4><span class="glyphicon glyphicon-tint" aria-hidden="true"></span> Назначение:</h4> 
      @Html.EditorFor(model => model.weight, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.weight) } }) 

      @Html.EditorFor(model => model.dose, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.dose) } }) 

      @Html.EditorFor(model => model.inADay, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.inADay) } }) 

     </div> 

     <div class="col-md-8"> 
      <h4><span class="glyphicon glyphicon-comment" aria-hidden="true"></span> @Html.DisplayNameFor(model => model.comments):</h4> 
      <p>@Html.EditorFor(model => model.comments, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.comments) } })</p> 
     </div> 



    </div> 

    </form> 
     <hr /> 
+0

так «обходной путь», чтобы создать метод, который вы хотите от нового экземпляра нового экземпляра контроллера вы находитесь и позвонить? Это звучит так, как будто вы на самом деле называете другой метод, чем вы ожидаете ... Есть ли другая перегрузка этого метода 'pacientDetails' в вашем' AssignmentController'? – Claies

+0

Можете ли вы опубликовать код View pacientEdit? –

+0

@Claies Нет, нет перегрузок для pacientDetails –

ответ

0

Я думаю, что проблема заключается в том, что вы пытаетесь связать Назначение ID и Идентификатор AssignmentType с тем же именем. Создать класс AssignmentViewModel (который в любом случае хорошая практика), где вы будете иметь только идентификатор «типа» члена, как это:

public class AssigmentViewModel 
{ 
    public int ID { get; set; }  
    public int TypeId { get; set; }  
    public decimal? weight { get; set; } 
    public decimal? dose { get; set; } 
    public decimal? inADay { get; set; } 
    [DataType(DataType.MultilineText)] 
    public String comments { get; set; } 
    public String medicine { get; set; } 
    public int actual { get; set; } 
    public DateTime cancelDate { get; set; } 
} 

Вы также можете попытаться изменить тип hiddenFor как это:

@Html.HiddenFor(model => model.type) 

Надеется, что это поможет

+0

Я использовал «Bind» для всех полей POST, кроме типа - теперь он работает. Благодаря! –