1

C# と SQL Server 2005 を使用して ASP .Net MVC 3 アプリケーションを開発しています。Entity Framework と Code First Method も使用しています。別のビュー「更新」へのリンクを含むビュー「インデックス」があります。デバッグ時にviewの値がNULLになる問題。

ビューは、名前が ProfileGa であるコントローラーによって取り込まれます。

これは、コントローラー ProfileGa のコードの一部です。

public ActionResult Update(string id)
{
    FlowViewModel flv = db.FlowViewModels.Find(id);
    return View(flv);
}

[HttpPost]
public ActionResult Update(FlowViewModel model)
{
    Console.WriteLine("" + model.Nbr_Passage);

        Gamme G = new Gamme();
        ListG.Remove(G);
        db.Gammes.Remove(G); 
        G.ID_Gamme = model.SelectedProfile_Ga;
        G.ID_Poste = model.SelectedPoste;
        G.Last_Posts = model.PostePrecedentSelected;
        G.Next_Posts = model.PosteSuivantSelected;
        G.Nbr_Passage = int.Parse(model.Nbr_Passage);
        G.Position = int.Parse(model.Position);
        ListG.Add(G);
        db.Gammes.Add(G);
        db.SaveChanges();

    return RedirectToAction("Index");
} 

行にブレークポイントを設定すると:

FlowViewModel flv = db.FlowViewModels.Find(id);

flv の値は NULL です。指定された ID を持つレコードがデータベースにない可能性があります。

このメソッドのコードは事前に定義されているため (私は作成していません)、メソッド Find について詳しく説明することはできません。DbSetのメソッドです。

同じコードが他のビューでも機能していますが、これだけです。

問題は、他の ID (TextBox) とは異なり、DropDownList である ID (ID_Gamme) に依存していると思います。

これは、ビュー Update へのリンクを含むビュー Index のコードの一部です。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.master" Inherits="System.Web.Mvc.ViewPage<MvcApplication2.Models.FlowViewModel>" %>
<%@ Import Namespace="Helpers" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<table>

<% foreach (var item in Model.GaItems) { %>
    <tr>
         <td>
            <%: Html.DisplayFor(modelItem => item.ID_Gamme) %>
        </td>
        <td>
            <%: Html.DisplayFor(modelItem => item.ID_Poste) %>
        </td>
        <td>
            <%: Html.DisplayFor(modelItem => item.Nbr_Passage) %>
        </td>
        <td>
            <%: Html.DisplayFor(modelItem => item.Position) %>
        </td>
        <td>
            <%: Html.DisplayFor(modelItem => item.Last_Posts) %>
        </td>
         <td>
            <%: Html.DisplayFor(modelItem => item.Next_Posts) %>
        </td>
        <td>    
            <%: Html.ActionLink("Modifier", "Update", new { id=item.ID_Gamme }) %>     
        </td>
    </tr>
<% } %>

</table>

</asp:Content>

そして、これはモデル FlowViewModel のコードです:

public class FlowViewModel
{    
    [Key]
    public string IDv { get; set; }
    [NotMapped]
    public SelectList PostesItems { get; set; }
    public List<Profile_Ga> Profile_GaItems { get; set; }
    public List<Gamme> GaItems { get; set; }
    public string SelectedProfile_Ga { get; set; }
    public string SelectedPoste { get; set; }  
    public string PostePrecedentSelected { get; set; } 
    public string PosteSuivantSelected { get; set; }    
    public string Position { get; set; }
    public string  Nbr_Passage { get; set; }    
    public List<Gamme> ListG = new List<Gamme>();    
}

Gestion.ascx の一部:

<% using (Html.BeginForm("Save", "Anouar")) { %>
    <%: Html.ValidationSummary(true) %>
    <fieldset class="parametrage">
        <legend>Gestion de Gamme</legend>
        <div><%:Html.Label("Poste :")%><%: Html.DropDownListFor(model => model.SelectedPoste, Model.PostesItems)%></div>

        <div><%:Html.Label("Nombre de Passage :")%><%: Html.EditorFor(model=>model.Nbr_Passage)%></div><div class="editor-field"> <%: Html.ValidationMessageFor(model => model.Nbr_Passage)%></div>
        <div><%:Html.Label("Position :")%><%: Html.EditorFor(model=>model.Position)%></div>
        <div><%:Html.Label("Poste Précédent :")%><%: Html.DropDownListFor(model => model.PostePrecedentSelected, Model.PostesItems)%></div>
        <div><%:Html.Label("Poste Suivant :")%><%: Html.DropDownListFor(model => model.PosteSuivantSelected, Model.PostesItems)%></div>

        <div><input type="submit" value="Enregistrer" id="btnSave"  /></div>
    </fieldset>
...
4

1 に答える 1

6

問題は、FlowViewModelがデータベース内のエンティティではなく、ViewModelであるためです。したがって、データベースにクエリを実行しようFlowViewModel.Find...としても、データベース テーブルにマップされていないため、何も返されません。

Gammeおそらく、 (書き込み先の)などの他のテーブルからさまざまな情報を取得したいと考えているでしょう。FlowViewModel他のデータベース エンティティからデータを入力してから、ビューに渡す必要があります。

Profile_GaItemsしたがって、Gammesデータベースエンティティからデータを入力したい場合は、次のようにします。

public ActionResult Update(string id)
{
    FlowViewModel flv = new FlowViewModel();
    flv.Profile_GaItems = db.Profile_GaItems.ToList();
    flv.GaItems  = db.Gammes.ToList();
    return View(flv);
}
于 2013-05-20T14:34:41.440 に答える