0

Курсовая работа, первый asp,net проект и не работает процедура в коде должным образом.

Мне кажется в asp.net нужно иначе работать с хранимыми процедурами в бд но не понимаю как.
Используется Entity 6 (НЕ Core).
Модель принимается как null и выдает

User Lookup Results No users found for the specified email.

т.к. модель null

рут:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace Translaters_Agency { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "UserLookup",
            url: "UserLookup/{action}/{id}",
            defaults: new { controller = "UserLookup", action = "FindUserByEmail", id = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
} 

}

Data Context:

using Data.Models;
using System.Collections.Generic;
using System.Data.Entity;

namespace Data { public class DataContext : DbContext { public DataContext() : base("DefaultConnection") { }

    public DbSet<User> Users { get; set; }
    public DbSet<Translator> Translators { get; set; }
    public DbSet<Order> Orders { get; set; }
    public DbSet<Comment> Comments { get; set; }
    public DbSet<Certificate> Certificates { get; set; }
    public DbSet<Rating> Ratings { get; set; }
    public DbSet<MarketingCalendar> MarketingCalendars { get; set; }
    public DbSet<FileTableModel> Files { get; set; } 
    public DbSet<Payment> Payments { get; set; }
    public DbSet<TranslatorOrder> TranslatorOrders { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }
}

}

namespace Data.Modelsnamespace Data.Models { public class UserSearchResultModel { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } } }

{ public class UserResultViewModel { [Required(ErrorMessage = "Email is required")] [EmailAddress(ErrorMessage = "Invalid email address")] public string Email { get; set; } public int Id { get; set; } public string Name { get; set; } } }

Контроллер:

using Data.Models;
using Data;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Web.Mvc;
using System;
using System.Linq;

[RoutePrefix("UserLookup")] public class UserLookupController : Controller { private readonly DataContext _context;

public UserLookupController()
{
    _context = new DataContext();
}

[HttpGet]
[Route("FindUserByEmail")]
public ActionResult FindUserByEmail()
{
    // экземп модели с дефолтными значениями
    var defaultModel = new UserResultViewModel
    {
        Email = "user5@example.com"
    };

    //  модель в представление
    return View(defaultModel);
}

[HttpPost]
public ActionResult FindUserByEmail(UserResultViewModel model)
{
    try
    {
        if (ModelState.IsValid)
        {
            System.Diagnostics.Debug.WriteLine($"Input Email: {model.Email}");
            SqlParameter param = new SqlParameter("@Email", model.Email);
            IEnumerable<UserSearchResultModel> results = _context.Database.SqlQuery<UserSearchResultModel>("EXEC FindUserByEmail @Email", param).ToList();
            System.Diagnostics.Debug.WriteLine($"Number of Results: {results?.Count()}");

            // Перенаправление на представление с результатом
            return View("UserLookupResult", results);
        }

        System.Diagnostics.Debug.WriteLine("Model state is not valid");

        return View(model);
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine($"Exception: {ex.Message}");

        // Обработка ошибок, если необходимо
        ViewBag.ErrorMessage = ex.Message;
        return View("Error");
    }
}

[HttpGet]
[Route("UserLookupResult")]
public ActionResult UserLookupResult(IEnumerable<UserSearchResultModel> results)
{
    return View(results);
}

}

Представление:

@model IEnumerable<Data.Models.UserSearchResultModel>

@{ ViewBag.Title = "User Lookup Results"; }

<h2>User Lookup Results</h2>

@if (Model != null) { <table class="table"> <tr> <th>ID</th> <th>Name</th> <th>Email</th> </tr> @foreach (var user in Model) { <tr> <td>@user.Id</td> <td>@user.Name</td> <td>@user.Email</td> </tr> } </table> } else { <p>No users found for the specified email.</p> }

<p>@Html.ActionLink("Back to Search", "FindUserByEmail")</p>

Сама процедура прекрасно работает в БД.

use Translaters_Buro
go
ALTER PROCEDURE [dbo].[FindUserByEmail]
@Email NVARCHAR(100)
AS
BEGIN

SELECT Id, Name, Email FROM Users WHERE Email = @Email; END; exec FindUserByEmail 'user5@example.com'

Пробовал ловить ошибки, менять структуру процедуры, брать данные напрямую из основной модели.

0 Answers0