ASP.NET MVC3:部分视图和主视图之间的交互

ASP.NET MVC3:部分视图和主视图之间的交互,asp.net,.net,asp.net-mvc,asp.net-mvc-3,razor,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 3,Razor,我有一个接触的局部视图。目前,索引视图显示了联系人详细信息的此部分视图。局部视图中有一个保存按钮,用于保存编辑的数据。保存编辑的数据时,存在年龄验证。这一切都很好 每当用户编辑年龄并保存它时,我需要在主视图上显示相应的星座预测。我们如何做到这一点 public class ContactEntity { public int ContactID { get; set; } public string ContactName { get; set; } [Range(18

我有一个接触的局部视图。目前,索引视图显示了联系人详细信息的此部分视图。局部视图中有一个保存按钮,用于保存编辑的数据。保存编辑的数据时,存在年龄验证。这一切都很好

每当用户编辑年龄并保存它时,我需要在主视图上显示相应的星座预测。我们如何做到这一点

public class ContactEntity
{
    public int ContactID { get; set; }
    public string ContactName { get; set; }

    [Range(18, 50, ErrorMessage = "Must be between 18 and 50")]
    public int ContactAge { get; set; }
}

public class AgeHoroscope
{
    public int Age { get; set; }
    public string HoroscopePrediction { get; set; }
}

//家庭控制器

namespace MYContactEditPartialViewTEST.Controllers
{
public class HomeController : Controller
{

    List<AgeHoroscope> horoList = new List<AgeHoroscope>()
    {
        new AgeHoroscope{Age=16,HoroscopePrediction="You are confused"},
        new AgeHoroscope{Age=26,HoroscopePrediction="You are very brilliant"},
        new AgeHoroscope{Age=27,HoroscopePrediction="You are practical"}
    };

    public ActionResult Index()
    {
        AgeHoroscope selectedHoro = horoList[1];
        return View(selectedHoro);
    }

  }
 }
namespace MYContactEditPartialViewTEST.Controllers
{
public class ContactController : Controller
{

    public PartialViewResult MyContactDetailEdit()
    {
        Thread.Sleep(500);
        return PartialView(GetContact());
    }


    [HttpPost]
    public PartialViewResult MyContactDetailEdit(string conatcclick)
    {
        //Save to database
        Thread.Sleep(500);
        return PartialView(GetContact());
    }


    private ContactEntity GetContact()
    {
        ContactEntity contactEntity = new ContactEntity();
        contactEntity.ContactID = 1;
        contactEntity.ContactName = "Lijo";
        contactEntity.ContactAge = 26;
        return contactEntity;
    }

 }
}
//Index.cshtml

@model  MYContactEditPartialViewTEST.AgeHoroscope
@{
 ViewBag.Title = "Index";
}

<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript">       </script>



<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>

<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

<h2>
    Index</h2>

<div>
<a>Your age is <b>@Html.DisplayFor(x => x.Age) </b>and the prediction is <b>" @Html.DisplayFor(x => x.HoroscopePrediction)
    " </b></a>
<br />
 </div>
<div style="border: 3px solid Teal">
@Html.Action("MyContactDetailEdit", "contact")
</div>
@model MYContactEditPartialViewTEST.age星座
@{
ViewBag.Title=“Index”;
}
指数


  • 我只想使用jQuery执行ajax post,然后直接更改父视图客户端

    您需要创建一个新的ViewModel来执行此操作。这个ViewModel(IndexViewModel.cs)看起来像这样(我猜是这样的):

    然后在控制器索引操作(和视图)中使用它:

    其想法是,您将在ContactEntity和AgeShoroscope(或通过Linq等)之间的连接中填充占星术预测,从而将索引中的每一行显示为一个完整的对象(显示contact和horoscope)。

    因为数据被发布到“HomeController”和“index”操作中,所以当您在视图中更改年龄时,会反映出更改

    尝试按如下方式修改主控制器,然后它将按预期工作

    1) 我们可以有一本关于年龄和预测的字典,而不是一份年龄占星术的清单

    2) 为HttpGet和HttpPost创建两个索引操作,如下所示

    public class HomeController : Controller
    {
    
        Dictionary<int, string> AgePred = new Dictionary<int, string>()
        {
        {16,"You are confused"},
        {26,"You are very brilliant"},
        {27,"You are practical"}
        };
    
        [HttpGet]
        public ActionResult Index()
        {
            AgeHoroscope selectedHoro = new AgeHoroscope() { Age = 26 };
            selectedHoro.HoroscopePrediction = AgePred[selectedHoro.Age];
            return View(selectedHoro);
        }
        [HttpPost]
        public ActionResult Index(AgeHoroscope model,ContactEntity entity)
        {
            model.Age = entity.ContactAge;
            model.HoroscopePrediction = AgePred[entity.ContactAge];
            return View(model);
        }
    
    }
    
    公共类HomeController:控制器
    {
    Dictionary AgePred=新字典()
    {
    {16,“你很困惑”},
    {26,“你很聪明”},
    {27,“你很实际”}
    };
    [HttpGet]
    公共行动结果索引()
    {
    年龄占星术选择Horo=新年龄占星术(){Age=26};
    selectedHoro.HoroscopePrediction=AgePred[selectedHoro.Age];
    返回视图(选择的方向);
    }
    [HttpPost]
    公共行动结果索引(年龄星座模型、联系人实体)
    {
    model.Age=entity.ContactAge;
    model.HoroscopePrediction=AgePred[entity.ContactAge];
    返回视图(模型);
    }
    }
    
    这是可能的;但我对这种方法不感兴趣,我给出的只是一个简单的例子。你的建议是不要偏袒他人,不是吗?这在我的真实场景中是不可能的。还有其他建议吗?我不认为,这就是我想要的。我在主视图中没有任何帖子。因此,是否要将数据发布到MyContactDetailEdit?当它返回PartialViewResult时,唯一的选项是发布javascript请求并使用结果更新视图。只有在为父操作调用的操作中,然后访问子操作以呈现部分视图,才能使用this.ControllerContext.ParentActionViewContext获取子操作中的父操作上下文
    public class IndexViewModel
    {
        public int ContactID { get; set; }
        public string ContactName { get; set; }
        public int ContactAge { get; set; }
        public string HoroscopePrediction { get; set; }
    }
    
    @model  MYContactEditPartialViewTEST.IndexViewModel
    
    public class HomeController : Controller
    {
    
        Dictionary<int, string> AgePred = new Dictionary<int, string>()
        {
        {16,"You are confused"},
        {26,"You are very brilliant"},
        {27,"You are practical"}
        };
    
        [HttpGet]
        public ActionResult Index()
        {
            AgeHoroscope selectedHoro = new AgeHoroscope() { Age = 26 };
            selectedHoro.HoroscopePrediction = AgePred[selectedHoro.Age];
            return View(selectedHoro);
        }
        [HttpPost]
        public ActionResult Index(AgeHoroscope model,ContactEntity entity)
        {
            model.Age = entity.ContactAge;
            model.HoroscopePrediction = AgePred[entity.ContactAge];
            return View(model);
        }
    
    }