Soy bastante nuevo en MVC y he buscado y comprobado varias soluciones, pero ninguna me ha funcionado todavía.

Tengo una base de datos creada con Code First. Tiene 3 mesas: Club, Match y Round. En cada ronda hay algunos partidos. En cada partido juegan 2 clubes. Match contiene una clave externa para Round (que funciona muy bien) y dos claves múltiples separadas para Match (equipo local y visitante).

Cuando agrego MatchesController con vistas usando EF e inicio la aplicación e intento ingresar una nueva coincidencia, tengo una lista desplegable de Rondas de la base de datos: funciona de manera increíble. También me gustaría tener dos listas desplegables con nombres / ID de equipo de la base de datos para poder seleccionar equipos que juegan, pero por alguna razón tengo dos cuadros de texto que me permiten escribir cualquier cosa, como si las restricciones de FK no existieran.

Estoy teniendo un gran problema porque no estoy seguro de qué estoy haciendo mal, ¿son las claves externas? Las codifiqué así mientras examinaba otras preguntas, pero ¿tal vez me equivoqué?

Clase redonda:

public class Round : IValidatableObject
{

    public int RoundID { get; set; }

    [Required]
    public int RoundNumber { get; set; }

    public virtual ICollection<Match> Matches { get; set; }
}

Clase de club:

    public class Club
{
    public int ClubID { get; set; }

    [Required]
    public string ClubName { get; set; }

    public virtual ICollection<Match> HomePlays { get; set; }
    public virtual ICollection<Match> AwayPlays { get; set; }
}

Match class y su clase de contexto DB:

    public class Match
{

    public int MatchId { get; set; }

    public int HomeClubId { get; set; }
    public int AwayClubID { get; set; }

    public virtual Club HomeClub { get; set; }
    public virtual Club AwayClub { get; set; }

    [Required]
    public int RoundId { get; set; }

    [ForeignKey("RoundId")]
    [InverseProperty("Matches")]
    public virtual Round Round { get; set; }

}

public class Context : DbContext
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Match>()
 .HasRequired(m => m.HomeClub)
 .WithMany(m => m.HomePlays)
 .HasForeignKey(m => m.HomeClubId)
 .WillCascadeOnDelete(false);

        modelBuilder.Entity<Match>()
             .HasRequired(m => m.AwayClub)
             .WithMany(m => m.AwayPlays)
             .HasForeignKey(m => m.AwayClubID)
             .WillCascadeOnDelete(false);
    }
}

Y luego está el MatchesController generado con acciones Index y Create:

    public class MatchesController : Controller
{
    private ApplicationDbContext db = new ApplicationDbContext();

    // GET: Matches
    public ActionResult Index()
    {
        var match = db.Match.Include(m => m.Round);
        return View(match.ToList());
    }

    // GET: Matches/Create
    public ActionResult Create()
    {
        ViewBag.RoundId = new SelectList(db.Round, "RoundID", "RoundID");
        return View();
    }

    // POST: Matches/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "MatchId,HomeClubId,AwayClubID,Club1Goals,Club2Goals,RoundId")] Match match)
    {
        if (ModelState.IsValid)
        {
            db.Match.Add(match);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.RoundId = new SelectList(db.Round, "RoundID", "RoundID", match.RoundId);
        return View(match);
    }
}

Y la vista Crear:

@model ProjSty3Exp.Models.Match

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) 
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
    <h4>Match</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    <div class="form-group">
        @Html.LabelFor(model => model.HomeClubId, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.HomeClubId, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.HomeClubId, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.AwayClubID, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.AwayClubID, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.AwayClubID, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.RoundId, "RoundId", htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownList("RoundId", null, htmlAttributes: new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.RoundId, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
</div>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>
0
Mus.K 16 ene. 2017 a las 04:48

1 respuesta

La mejor respuesta

En el método Get action

public ActionResult Create()
    {
        ViewBag.RoundId = new SelectList(db.Round, "RoundID", "RoundID");
        ViewBag.AwayClubID = new SelectList(db.Clubs, "ClubID", "ClubID");
        ViewBag.HomeClubId = new SelectList(db.Clubs, "ClubID", "ClubID");
        return View();
    }

En vista de navaja

Reemplazar

@Html.EditorFor(model => model.HomeClubId, new { htmlAttributes = new { @class = "form-control" } })

Por

@Html.DropDownList("HomeClubId", null, htmlAttributes: new { @class = "form-control" })

Reemplazar

@Html.EditorFor(model => model.AwayClubID, new { htmlAttributes = new { @class = "form-control" } })

Por

@Html.DropDownList("AwayClubID", null, htmlAttributes: new { @class = "form-control" })

Método de acción posterior

    // POST: Matches/Create
// To protect from overposting attacks, please enable the specific properties you want to bind to, for 
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "MatchId,HomeClubId,AwayClubID,Club1Goals,Club2Goals,RoundId")] Match match)
{
    if (ModelState.IsValid)
    {
        db.Match.Add(match);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    ViewBag.RoundId = new SelectList(db.Round, "RoundID", "RoundID", match.RoundId);
    ViewBag.AwayClubID = new SelectList(db.Clubs, "ClubID", "ClubID", match.AwayCludId);
    ViewBag.HomeClubId = new SelectList(db.Clubs, "ClubID", "ClubID", match.HomeClubId);
    return View(match);
}
0
Dan Nguyen 16 ene. 2017 a las 06:27