4

I am attempting to generate my first MVC application. I have a very basic table: Teams: ID,Name. I have created the MVC app ok and the table is listed. Below is the Create View. When it is run I get the message: A value is required. Can you help (sorry this is very basic).

View create.aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"     Inherits="System.Web.Mvc.ViewPage<GettingStarted.Models.Team>" %>

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

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

<h2>Create</h2>

<%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="Name">Name:</label>
            <%= Html.TextBox("Name") %>
            <%= Html.ValidationMessage("Name", "*") %>
        </p>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

<div>
    <%=Html.ActionLink("Back to List", "Index") %>
</div>

</asp:Content>

with controller teamcontroller:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using GettingStarted.Models;
using DB = GettingStarted.Models.GettingStartedDataContext;

namespace GettingStarted.Controllers
{
    public class TeamController : Controller
    {
        // other actions
        ...
        //
        // GET: /Team/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Team/Create

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(Team team)
        {

            if (ModelState.IsValid)
            {
                try
                {
                    var db = new DB();
                    db.Teams.InsertOnSubmit(team);
                    db.SubmitChanges();
                    return RedirectToAction("Index");
                }
                catch
                {
                    return View(team);
                }
            }
            return View(team);
        }

    }
}
2
  • 1
    Good start, but we need a little more information from you. Are you getting the error in the Get or the Post? What line is the exception happening on? Commented Jul 30, 2010 at 10:10
  • @nprosser: Actually somori makes a good point. By the info you've provided we can't be really sure whether this happens in the GET or POST of your create process? Does it happen when you first want to display this view or after you fill in the textbox and submit it back to the server? Commented Jul 30, 2010 at 11:10

3 Answers 3

2

Your Create view is strong type so provide a view model instance:

public ActionResult Create()
{
    return View(new Team());
}

or

public ActionResult Create()
{
    return View((Team)null);
}
Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for your response. It made sense to pass the model instance. However it still complains 'Create was unsuccessful - a value is required'
I was advised to use post (ms video) [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create(Team team) { if (ModelState.IsValid) { try { var db = new DB(); db.Teams.InsertOnSubmit(team); db.SubmitChanges(); return RedirectToAction("Index"); } catch { return View(team); } } return View(team); }
@nprosser: could you also change the code in your question with the one that you used to get to the mentioned exception and attach stack trace of that particular error, so we can actually see what's going on.
1

The problem may be an annotation on a field in the Model. Have you checked your Model for something like:

public class Team {

   [Required(ErrorMessage = "A value is required")]
   public string whatEver {get; set;}

   ...
}

Comments

0

A hint: Also add a Create action, which takes Team as parameter, to handle validation errors.

public ActionResult Create(Team team)
{
    return View(team);
}

Also passing a null value to a create form isn't necessary! Your problem might be somewhere else. Can you try to use

<%= Html.TextBoxFor(model => model.Name) %>
<%= Html.ValidationMessageFor(model => model.Name) %>

instead of

<%= Html.TextBox("Name") %>
<%= Html.ValidationMessage("Name", "*") %>

?

9 Comments

This was already part of the controller: public ActionResult Create(Team team) { if (ModelState.IsValid) { try { var db = new DB(); db.Teams.InsertOnSubmit(team); db.SubmitChanges(); return RedirectToAction("Index"); } catch { return View(team); } } return View(team); }
Updated my answer, try this :)
when I replace with '<%= Html.TextboxFor(model => model.Name) %> <%= Html.ValidationMessageFor(model => model.Name) %> ' I get the message CS1061: 'System.Web.Mvc.HtmlHelper<GettingStarted.Models.Team>' does not contain a definition for 'TextboxFor' and no extension method 'TextboxFor' accepting a first argument of type 'System.Web.Mvc.HtmlHelper<GettingStarted.Models.Team>' could be found (are you missing a using directive or an assembly reference?)
@nprosser: well in that case you must be using MVC 1 and not 2 as you indicated in your tags.
I installed MVC2 well that was the intention. Will investigate - would you know a quick way to check the version?
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.