2016-03-22 12 views
0

'PostReply' kısmi görünümünü içeren 'Ayrıntılar' adıyla bir Görünümüm var. Ayrıntılar görünümünden PostReply Controller eylemine bir Kimlik iletmeye çalışıyorum.Bir Kimlik değerini Kısmi Görünüme Geçirme

Bunu Ayrıntılar görünümünde denedim, ancak id'in boş değerini iter. Bu aynı zamanda çalışmaz

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

:

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

Sonra böyle Haberlercevaplar içinde BeginForm bir id değerine (Kısmi Görünüm) ekleyerek çalıştı. PostReply'den ayrıntılardan nasıl id değeri alabilirim? Şimdiden teşekkürler.

Detaylar Görünüm:

@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()) 

Haberlercevaplar (Kısmi Görünüm):

@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" /> 
} 

Detaylar & Haberlercevaplar Kontrolörler:

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 Modeli:

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

Yeni XXXXX.Models.Reply {QuestionID = Model.Question.ID}) 'Reply' QuestionId' yüzden tahmin ediyorum' adında bir özellik içeren 'demektir' Modelleri gösterildiği ancak henüz senin formunuzda yeni {id = Model.QuestionId} 'ifadesini isteyin ('NullReferenceException'ı atayan' Model.Question.ID 'değil) –

+0

Ben de modelleri ekledim. QuestionId bir tablodaki yabancı bir anahtardır. Yanıtla ve ben de soru formülü ID'si – ashhad

+0

ile doldurmaya çalışıyorum Önce tüm ilgili olmayan kodu düzenleyeyim ve sileyim. –

cevap

1

Kısmi bir görünümü oluşturur ve bunun için bir çocuk eylemi çalıştırmak için @Html.Action yöntemi kullanmalısınız. @Html.Partial hiçbir işlem yöntemini çağırmaz.

Yani, çocuk bakış render

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

gibi görünmelidir ve denetleyici çocuk action özelliği [HttpPost] ile çalışmaz. [ValidateAntiForgeryToken] ile birlikte kaldırmak daha iyidir.

Doğrudan istek sonucunda eylemi çağırmayı yasaklamak için [ChildActionOnly] özniteliği ile bu tür eylemleri kullanmak iyi bir uygulamadır.

GÜNCELLEME: Üzgünüm, görünümü işlemek için eylem gelen bazı verileri almak gerekir, ama Stephen Muecke yorumuna sonra sana ihtiyacım yok olduğunu fark etti. Yani, genel olarak Stephen

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

ve sonra

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

ya da Haberlercevaplar formu yerine rota parametresi

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

için gizli bir alan ekleyebilirsiniz önerdi kullanmalıdır Yanlış bir BeginForm aşırı yükü kullanırsanız, rota parametresiyle yaklaşım işe yaramaz.bu bir

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

Teşekkürler, sorunumu çözdünüz. :) – ashhad

+0

Ama bir sorum var ValidateAntiForgeryToken ve HttpPost silindi ve aynı zamanda ChildActionOnly kullanamazsınız, çünkü bir yazı oluştururken, 'PostReply' eylemi 'yalnızca bir çocuk isteği tarafından erişilebilir' diyor bir hata oluştu. Çağrıları yasaklamaksızın kontrolör kullanmaktan mı kurtulur? – ashhad

+0

Çocuk eylemine posta göndermemeyi tercih ederim. Dışarıdan elde edilebilecek başka bir eylem oluşturabilir ve [HttpPost], [ValidateAntiForgeryToken] öznitelikleri alabilir ve bu eyleme gönderebilirsiniz. İki eylemin ortak kısmı ayrı bir yöntemle çıkarılabilir veya bir eylem başka birinden çağrılabilir. –

İlgili konular