2016-03-22 8 views
0

「詳細」に「PostReply」という部分ビューが含まれているビューがあります。詳細ビューからPostReplyコントローラアクションにIDを渡そうとしています。パーシャルビューにId値を渡す

詳細ビューでこれを試しましたが、idのnull値をプッシュします。また、これは動作しません

Html.BeginForm("PostReply", "Question", new { id = Model.Question.ID})) 

@Html.Partial("PostReply", new XXXXX.Models.Reply{ QuestionId = Model.Question.ID }) 

は、それから私はこのようなPostReplyでBeginFormへのid値(部分図)を追加してみました。詳細からPostReplyにid値を取得するにはどうすればよいですか?前もって感謝します。

詳細表示:

@model XXXXXX.Models.ParentView.Questions 
.... 
@Html.DisplayNameFor(model => model.QuestionModel.Title) 
@Html.DisplayNameFor(model => model.QuestionModel.Desc) 
.... 
@Html.ActionLink("Edit", "Edit", new { id = Model.QuestionModel.ID }) | 
     @Html.ActionLink("Back to List", "Index") 
.... 
@Html.Partial("PostReply", new Chemtalks.Models.Reply()) 

PostReply(一部):

@model XXXXX.Models.Reply 
@using (Html.BeginForm("PostReply", "Question", FormMethod.Post)) 
{ 
    @Html.LabelFor(model => model.ReplyText) 
    @Html.EditorFor(model => model.ReplyText) 
    @Html.ValidationMessageFor(model => model.ReplyText 

    <input type="submit" value="Create" class="btn btn-default" /> 
} 

詳細& PostReplyコントローラ:

public ActionResult Details(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    var model = new ParentView.Questions 
    { 
     QuestionModel = db.QuestionModels.Find(id), 
     Reply = db.Replies.Where(t => t.QuestionId == id) 
    }; 
    if (model == null) 
    { 
     return HttpNotFound(); 
    } 
    return View(model); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult PostReply([Bind(Include = "ReplyID, ReplyText, UserID, QuestionId")] Reply reply, int? id) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      reply.QuestionId = id; 
      reply.UserID = User.Identity.GetUserId(); 
      db.Replies.Add(reply); 
      db.SaveChanges(); 
     } 
    } 
    catch (DataException) 
    { 

     ModelState.AddModelError("", "Unable to post your reply. Please try again later."); 
    } 

    return PartialView(reply); 
} 

QuestionModel:

public class QuestionModels 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Desc { get; set; } 
    public string UserID { get; set; } 
    [ForeignKey("QuestionId")] 
    public virtual ICollection<Reply> Replies { get; set; } 
} 

public class Reply 
{ 
    public int ReplyID { get; set; } 
    public string ReplyText { get; set; } 
    public string UserID { get; set; } 
    public int? QuestionId { get; set; } 
    public virtual QuestionModels QuestionsModels { get; set; } 
} 

ParentViewモデル:

public class ParentView 
{ 
    public class Questions 
    { 
     public QuestionModels QuestionModel { get; set; } 
     public IEnumerable<Reply> Reply { get; set; } 
    } 
} 
+0

あなたのモデルを示していないが、 '新しいXXXXX.Models.Replyは{QuestionId = Model.Question.ID})' 'Reply'は、私はあなたを推測している' QuestionId'という名前のプロパティが含まれていることを意味あなたのフォームに 'new {id = Model.QuestionId}'を入れてください。(Model.Question.ID'ではなく、NullReferenceExceptionを投げる可能性があります) –

+0

私もモデルを追加しました。 QuestionIdはテーブル内の外部キーです返信と私はQuestionmodelテーブルのIDを入力しようとしています – ashhad

+0

最初に無関係なコードを編集して削除しましょう。 –

答えて

1

あなたは部分的なビューをレンダリングし、それの子アクションを実行するために@Html.Actionメソッドを使用する必要があります。 @Html.Partialはアクションメソッドを呼び出しません。

ので、子ビューのレンダリングは

@Html.Action("PostReply", new XXXXX.Models.Reply{ QuestionId = Model.Question.ID }) 

のようになりますと、コントローラ内の子アクションは、属性[HttpPost]では動作しません。 [ValidateAntiForgeryToken]と一緒に取り除く方が良いでしょう。

[ChildActionOnly]属性でこの種のアクションを使用して、直接要求の結果としてアクションを呼び出すことを禁止することをお勧めします。

UPDATE: 申し訳ありませんが、私は、ビューをレンダリングするアクションからいくつかのデータを取得する必要があると思ったが、ステファン・ミュエッケさんのコメントの後に私はあなたがそれを必要としないことに気づきました。だから、一般的に、あなたはスティーブンではなく、ルートパラメータの

@Html.Partial("PostReply", new Chemtalks.Models.Reply { QuestionId = Model.QuestionModel.ID }) 

、その後

Html.BeginForm("PostReply", "Question", new { QuestionId = Model.QuestionId }) 

か、あなたのPostReplyフォームに隠しフィールドを追加することができますを示唆したものを使用する必要があります

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

あなたが間違ってBeginForm過負荷を使用すると、routeパラメータを使ったアプローチがうまくいかないこの1

Html.BeginForm("PostReply", "Question", FormMethod.Post, new {QuestionId = Model.QuestionId}) 
+0

ありがとうございました。あなたは私の問題を解決しました。 :) – ashhad

+0

私は質問がある、私はValidateAntiForgeryTokenとHttpPostを削除しているし、ChildActionOnlyを使うことができない。なぜなら、ポストの作成時に 'アクション' PostReply 'が子リクエストによってのみアクセス可能であるというエラーが発生しているからだ。それはコールを禁止せずにコントローラを使用することを保存するのですか? – ashhad

+0

私は子供の行動に投稿したくないです。外部から利用可能な別のアクションを作成し、[HttpPost]、[ValidateAntiForgeryToken]属性を持つことができ、そのアクションに投稿することができます。 2つのアクションの共通部分を別のメソッドに抽出することも、別のアクションから1つのアクションを呼び出すこともできます。 –

関連する問題