Karishma
Karishma

Reputation: 199

MVC5 Post data from partial view being used in main view

I have already tried many solutions available on web as per my understanding in context to this question but being new in MVC I am still unable to find a solution. Kindly help.

I have a view which is the home page of the website named as "Index.cshtml" and is situated under the following path: WebsiteName/Areas/Website/Views/CypressHome/Index.cshtml

Secondly, I have a created a user trial form as partial view named as "_PartialHomeFormFreeTrial.cshtml" which is situated under the following path: WebsiteName/Areas/Website/Shared/_PartialHomeFormFreeTrial.cshtml. This form I have used inside my "Index.cshtml" as below:

<!--freetrialform-->
    @Html.Partial("_PartialHomeFormFreeTrial")
<!--//freetrialform-->

Now, my partial page is posting data comprising of following elements:

@using (Html.BeginForm("Create", "Customer", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    <div>
    @Html.EditorFor(model => model.CustomerName, new { htmlAttributes = new { @class = "input__field input__field--kuro" } })
    @Html.ValidationMessageFor(model => model.CustomerName, "", new { @class = "text-danger" })

    ............
    other fields such as email, phone, date, etc..
    <input type="submit" id="" value="SEND REQUEST" />
    </div>
}

Now, I have created a controller named "CustomerController" which has the following code to save the data of the form as used as partial view in the main view "Index.cshtml":

public class CustomerController : Controller
{
    private WebsiteContext db = new WebsiteContext();

    // GET: Website/Customer
    public ActionResult Index()
    {
        return View();
    }

    // GET: Website/Customer/Create
    public ActionResult Create()
    {
        ViewBag.StatusPlanID = new SelectList(db.StatusPlans, "StatusPlanID", "Status");
        return View("Index");
    }

    // POST: Website/Customer/Create
    [HttpPost]
    public ActionResult Create([Bind(Include = "CustomerID,CustomerName,CustomerEmail,CustomerPhone,DateOfRegistration,StatusPlanID")] Customer customer)
    {
        if (ModelState.IsValid)
        {
            db.Customers.Add(customer);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.StatusPlanID = new SelectList(db.StatusPlans, "StatusPlanID", "Status", customer.StatusPlanID);
        return View(customer);
    }
}

I have tried many changes in my controller, return in the views and many other things but I am getting the same error always. Neither the validations are working nor the validated data is getting saved.

The error is as below:

Server Error in '/' Application.

The view 'Create' or its master was not found or no view engine supports the searched locations. The following locations were searched:
~/Areas/Website/Views/Customer/Create.aspx
~/Areas/Website/Views/Customer/Create.ascx
~/Areas/Website/Views/Shared/Create.aspx
~/Areas/Website/Views/Shared/Create.ascx
~/Views/Customer/Create.aspx
~/Views/Customer/Create.ascx
~/Views/Shared/Create.aspx
~/Views/Shared/Create.ascx
~/Areas/Website/Views/Customer/Create.cshtml
~/Areas/Website/Views/Customer/Create.vbhtml
~/Areas/Website/Views/Shared/Create.cshtml
~/Areas/Website/Views/Shared/Create.vbhtml
~/Views/Customer/Create.cshtml
~/Views/Customer/Create.vbhtml
~/Views/Shared/Create.cshtml
~/Views/Shared/Create.vbhtml

And the url is changing as below: 1. On running the system initially: http://localhost:53872/ 2. On clicking on submit: http://localhost:53872/Areas/Website/Customer/Create along with the error as stated above.

For more information my WebsiteAreaRegistration.cs file contains the below code:

public class WebsiteAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "Website";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Website_home",
            "",
            new { controller = "CypressHome", action = "Index", id = UrlParameter.Optional }
        );

        context.MapRoute(
            "Website_default",
            "Areas/Website/{controller}/{action}/{id}",
            new { controller = "CypressHome", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Though I have understood the problem but unable to figure out. Kindly help.

Upvotes: 0

Views: 671

Answers (1)

Ashiquzzaman
Ashiquzzaman

Reputation: 5284

In your code last return statement is return View(customer). That's means after POST data it return a View (using HTTP GET method) as same name as Action that's Create. But your description you have a Create Action but you have no view page. So please create a Create.cshtml with a Model corresponding customer Object. Or change the return statement.

Based on your comment you can follow this Change.

1.Remove

public ActionResult Create()
    {
        ViewBag.StatusPlanID = new SelectList(db.StatusPlans, "StatusPlanID", "Status");
        return View("Index");
    }

2.then change

public ActionResult Index()
 {

      ViewBag.StatusPlanID = new SelectList(db.StatusPlans, "StatusPlanID", "Status");

      return View(new Customer());
  }

3.in Index.cshtml

@Model Customer        
@Html.Partial("_PartialHomeFormFreeTrial",Model)

4.Then

   return View("Index",customer);

Upvotes: 1

Related Questions